繁体   English   中英

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

[英]Linux sh script split sentence into words

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

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

for w in $1; do
    echo $i
done

输出:

a
b
c

请注意,缺少$1左右的报价。 这样可以确保将其拆分为单词,而不是对其进行整体处理。 用处理您内心渴望的任何东西代替echo

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

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 "abcde" 您可以看到如下结果。

$ 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

祝好运!

您只需要使用双引号(“)来防止外壳程序将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”防止外壳程序“扩展”第一个参数,因此您看到的是“ $”而不是“ a”

abc被视为3个参数($ 1,$ 2和$ 3); “ abc”被视为一个参数($ 1)。 在此示例中,“ abc”(双引号)和“ abc”(单引号)将是等效的。

无论您使用的是Bourne shell(“ sh”)还是“ bash”,“ quote”语法都是相同的。

如果要将聚合(“ abc”)视为单独的元素,则可以使用“ $ @”参数。

最后,大多数系统上的“ / bin / sh”是Posix shell,而不是Bourne shell。 因此,不一定共享Bourne shell的局限性:

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

运行a.sh "abcde" 3

c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM