Linux sh脚本将句子拆分为单词



我有一个脚本,它将一个句子作为输入输入到$1中。如何将$1(例如"a b c d e")拆分为a b c d e并分别访问它们?使用sh而不是bash

bash不同,sh不支持数组。如果您需要访问每个元素,您可以在for循环中使用默认的拆分功能:

for w in $1; do
    echo $i
done

输出:

a
b
c

请注意$1周围缺少引号。这确保了它被分解成单词,而不是被单一地对待。将echo替换为任何你想要的处理方式。

如果你只对一个特定的元素感兴趣,你可以使用cut,它可以在任何shell中工作,因为它是一个程序,而不是sh:的一部分

echo "$1" | cut -d ' ' -f 2

输出:

b

在这种情况下,$1周围的引号是可选的,因为echo无论如何都会转储所有内容。

脚本名为a.sh

#!/bin/bash
tokens=( $1 )
echo ${tokens[*]}  # all array data
echo ${#tokens[@]} # length of array
echo ${!tokens[@]} # get all index
echo ${tokens[0]}  # first data in array
echo ${tokens[1]}  # second data in array
for index in ${!tokens[@]}; do
  echo $index : ${tokens[$index]}
done

运行a.sh "a b c d e"。您可以看到如下结果。

$ bash a.sh "a b c d e"
a b c d e
5
0 1 2 3 4
a
b
0 : a
1 : b
2 : c
3 : d
4 : e

祝你好运!

您只需要使用双引号(")来防止shell将a、b和c解析为单独的参数。

EXAMPLE:
vi cat tmp.sh
#!/bin/sh
echo '$1=' $1 ', $@=' $@
./tmp.sh "a b c"
$1= a b c , $@= a b c
./tmp.sh a b c
$1= a , $@= a b c

注意:

语法"$1"阻止shell"扩展"第一个参数,因此您看到的是"$"而不是"a"

a b c被视为3个自变量($1、$2和$3);"a b c"被视为一个自变量($1)。在本例中,"a b c"(双引号)和"a b c"(单引号)是等效的。

无论您使用的是Bourneshell("sh")还是"bash","quote"语法都是相同的。

如果您想将聚合("a b c")视为单独的元素,可以使用"$@"参数。

最后,大多数系统上的"/bin/sh"是Posix shell,而不是Bourne shell。因此,它不一定与Bourne shell的局限性相同:

  • #之间有什么区别/bin/sh和#/bin/bash?

  • Unix Bourne Shell 中的数组

a.sh

echo $1 | cut -d ' ' -f $2

运行CCD_ 22。

c

最新更新