bash脚本反转行

bash脚本反转行

所以我遇到了这个脚本来反转输入行

#! /bin/bash  
input="${1}"  
reverse=""  
len=${#input}  
for(( i=${len}-1; i>=0; i-- ))  
do  
reverse="$reverse${input:${i}:1}"  
done  
echo "$reverse"  

有人可以解释一下 #input 和 for 循环的作用吗?

答案1

简化后,您的脚本应该如下所示:

#! bin/bash

input="${1}"    reverse=""

for   (( i=0; i<${#input}; i++ ))
do    reverse="${input:${i}:1}$reverse"
done
echo   "$reverse"

假设您将上面的代码放在名为的文件中script.sh,并且允许执行它:chmod u+x script.sh。然后,这个命令将起作用:

$ ./script.sh 0123456789
9876543210

${#input} 的值是输入的长度(字符数)。
该循环从头到尾逐个字符地进行。
为了选择每个字符,该脚本使用了名为“子字符串扩展”的 bash 工具。
引用man bash(您也可以通过输入访问它man bash):

${parameter:offset:length}
子字符串扩展。从偏移量指定的字符开始扩展到参数的最大长度字符。

这意味着i依次选择该位置的每个字符以在变量上重新创建字符串reverse

但您不需要任何循环或花哨的编码来执行此操作。这个简单的行将执行完全相同的操作:

$ echo "0123456789" | rev
9876543210

答案2

${#str}是 $str 值的长度。看外壳参数扩展在 bash 手册中。

for ((i=j-1; i>=0; i--))只是一个类似 C 的 for 循环,使用 bash 的算术语法。看循环结构在手册中

答案3

  1. ${#input}是 中的字符数$input。有时,当你看到 时#,应该想到“数字”。
  2. 难道真的不明显吗?该循环从末尾到开头一次for遍历一个字符。$input因此,例如,如果$inputis unix tm,则for循环将从其中检索字符 m, t, , , x, i,nu,并将它们附加到reverse
  3. 第一行应该是#!/bin/bash- 你缺少一个/.

答案4

很简单,只需使用getopts.它的全部工作就是逐个字符地分解字符串,并提供一个 API 来读取输出变量中的该字符。

input='some string or something' output= OPTIND=1
while  getopts : na "-$input"
do     output=$OPTARG$output
done;  echo "$output"

gnihtemos ro gnirts emos

您不必计算任何内容或索引或任何内容。getopts甚至在完成后立即返回终止循环。这很容易。

相关内容