所以我遇到了这个脚本来反转输入行
#! /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
答案3
${#input}
是 中的字符数$input
。有时,当你看到 时#
,应该想到“数字”。- 难道真的不明显吗?该循环从末尾到开头一次
for
遍历一个字符。$input
因此,例如,如果$input
isunix tm
,则for
循环将从其中检索字符m
,t
,x
,i
,n
和u
,并将它们附加到reverse
。 - 第一行应该是
#!/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
甚至在完成后立即返回终止循环。这很容易。