问题
我想对shell脚本(bin/bash(中使用的字符串的每个字母执行一个命令。在下面提到的情况下,我将向"$@"输入发送中文字符,但字符串中没有空格和分隔符。我正在考虑利用字符串长度,然后访问字符串中每个位置的索引:以下是我目前所拥有的(注意rdef是我创建的自定义命令(
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/:
export PATH
for f in "$@"
do
//need to loop through the input and perform action on each index of the $f variable
rdef "$f"|awk -F '|' '{ gsub(/^ +| +$/, "", $2); print $2 }'
done
订单的标准输入:
rdef 快乐
订单的标准输出:
Definition of <快乐>: | kuài lè |
happy
merry
更新
尽管另一个问题是相似的,但它不是相同的上下文。例如,在这种情况下,我需要拆分作为参数传递给脚本的字符串。我还需要将拆分字符串应用于一组链接的命令。所有这些都体现了相关问题中未涉及的细微差别。
我试过下面的代码,它似乎对汉字不起作用。当我插入ASCII字符时,命令会执行并返回正确的结果。
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/:
export PATH
for f in "$@"
do
foo="$f"
for (( i=0; i<${#foo}; i++ )); do
rdef ${foo:$i:1}|awk -F '|' '{ gsub(/^ +| +$/, "", $2); print $2 }'
done
done
注:
我的最后一个命令行应该使我能够在每个字母上执行链接到awk的自定义命令:
rdef "$letter-var"|awk -F '|' '{ gsub(/^ +| +$/, "", $2); print $2 }'
有关rdef的更多信息,请访问以下操作系统问题
解决方案
提供的所有解决方案都运行良好。我选择了@kojiro提供的选项,因为他为我指明了需要UTF-8的正确方向。这是一个重要的发现,因为汉字的双字节特性正在破坏循环的执行。
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/:
export PATH
LC_CTYPE=UTF-8
x=$1
for ((i=0;i<${#x};i++)); do rdef "${x:i:1}" | awk -F '|' '{ gsub(/^ +| +$/, "", $2); print $2 }'; done
Bash 4内置了子字符串切片:
$ x='红楼梦'
$ for ((i=0;i<${#x};i++)); do echo "${x:i:1}"; done
红
楼
梦
您可以使用awk对每个字母执行一个命令。
echo "XXXXX"
| awk -v FS="" '{ for( I=1 ; I <= NF ; I++ ){ system( "command " $I ) } }
- FS="告诉awk每个字符都是一个单独的字段
- for循环对字符进行迭代并执行命令
- 您需要将命令替换为要执行的命令
例如:
echo "いい天気ですね "
| awk -v FS="" '{ for( I=1 ; I <= NF ; I++ ){ system( "echo "x" $I "x"" ) } }'
将显示:
xいx
xいx
x天x
x気x
xでx
xすx
xねx
x x
您将需要一个支持多字节字符的awk。
您也可以使用perl
:
perl -C -lnE 'say for split //' <<<"红楼梦"
打印
红
楼
梦
您可以使用sed添加缺失的空格,这将使for循环在每个字符上迭代:
for f in $( echo "$*" | sed -e 's/(.)/1 /g' )
do
...
done