bash shell 脚本如何使用 space 构造数组元素
how bash shell script construct array element with space
我想用 space
构造数组元素,它在 运行 命令行中工作:
pc:/tmp$ b=('1 2' '3 4')
pc:/tmp$ echo $b
1 2
pc:/tmp$ echo ${b[1]}
3 4
但是它在脚本中用 space
分割元素:
pc:/tmp$ cat t.sh
a="'1 2' '3 4'"
echo $a
b=($a)
echo $b
echo ${b[1]}
echo ${b[2]}
pc:/tmp$ bash t.sh
'1 2' '3 4'
'1
2'
'3
我想用 echo $b
得到 '1 2'
就像在脚本中得到 '3 4'
和 ${b[1]}
一样。
我怎样才能做到这一点?
为什么它不能在脚本中运行但在命令行中运行?
代码 a="'1 2' '3 4'"
不会创建数组,它会创建一个带有嵌入式单引号的字符串。
$: a="'1 2' '3 4'"
$: echo "[$a]"
['1 2' '3 4']
如果你想创建一个数组,你必须使用正确的语法。
$: a=( '1 2' '3 4' )
$: printf "[%s]\n" "${a[@]}"
[1 2]
[3 4]
然后如果你想把它复制到另一个数组,就把它当作一个数组而不是一个字符串。
b=( "${a[@]}" )
printf "[%s]\n" "${b[@]}"
[1 2]
[3 4]
要将在a="'1 2' '3 4'"
中创建的字符串转换为数组有点棘手。
IF 你知道格式和上面一致匹配,试试这个:
$: echo "[$a]"
['1 2' '3 4']
$: IFS='#' read -ra b < <( sed -E "s/' +'/#/g; s/ *' *//g" <<< "$a" )
$: printf "[%s]\n" "${b[@]}"
[1 2]
[3 4]
但总的来说,这是一个糟糕的计划。尝试修复您的 input!
我想用 space
构造数组元素,它在 运行 命令行中工作:
pc:/tmp$ b=('1 2' '3 4')
pc:/tmp$ echo $b
1 2
pc:/tmp$ echo ${b[1]}
3 4
但是它在脚本中用 space
分割元素:
pc:/tmp$ cat t.sh
a="'1 2' '3 4'"
echo $a
b=($a)
echo $b
echo ${b[1]}
echo ${b[2]}
pc:/tmp$ bash t.sh
'1 2' '3 4'
'1
2'
'3
我想用 echo $b
得到 '1 2'
就像在脚本中得到 '3 4'
和 ${b[1]}
一样。
我怎样才能做到这一点?
为什么它不能在脚本中运行但在命令行中运行?
代码 a="'1 2' '3 4'"
不会创建数组,它会创建一个带有嵌入式单引号的字符串。
$: a="'1 2' '3 4'"
$: echo "[$a]"
['1 2' '3 4']
如果你想创建一个数组,你必须使用正确的语法。
$: a=( '1 2' '3 4' )
$: printf "[%s]\n" "${a[@]}"
[1 2]
[3 4]
然后如果你想把它复制到另一个数组,就把它当作一个数组而不是一个字符串。
b=( "${a[@]}" )
printf "[%s]\n" "${b[@]}"
[1 2]
[3 4]
要将在a="'1 2' '3 4'"
中创建的字符串转换为数组有点棘手。
IF 你知道格式和上面一致匹配,试试这个:
$: echo "[$a]"
['1 2' '3 4']
$: IFS='#' read -ra b < <( sed -E "s/' +'/#/g; s/ *' *//g" <<< "$a" )
$: printf "[%s]\n" "${b[@]}"
[1 2]
[3 4]
但总的来说,这是一个糟糕的计划。尝试修复您的 input!