如何给脚本一个神奇的变量(占位符)?
让我们有一个loop脚本:
#!/bin/bash
count=$1
shift
for i in $(seq 1 $count)
do
$*
done我想这样称呼它:
loop 5 echo Mambo number $i
但是,Bash在脚本调用之前扩展变量并生成:
Mambo number
Mambo number
Mambo number
Mambo number
Mambo number如果我这么说:
loop 5 echo Mambo number '$i'
变量不会在脚本中展开。
Mambo number $i
Mambo number $i
Mambo number $i
Mambo number $i
Mambo number $i在bash中有使用神奇变量的聪明方法吗?
我要做到:
Mambo number 1
Mambo number 2
Mambo number 3
Mambo number 4
Mambo number 5还包括:
loop 3 touch 'foo-$i.log'
要创建三个文件:
foo-1.log
foo-2.log
foo-3.log发布于 2020-10-04 02:50:13
看来你想证明你的论点
#!/bin/bash
count=$1
shift
for i in $(seq 1 $count)
do
eval "$@"
done您必须保护以后要展开的所有变量。
bash loop.sh 3 echo test '"$i"'
test 1
test 2
test 3或者最好将单引号中的整个字符串保护为一个字符串参数。
bash loop.sh 3 'echo "$i" "$((i+1))" $(bc -l <<< "$i+2")'
1 2 3
2 3 4
3 4 5小心点。
发布于 2020-10-04 02:51:20
我可以想出两种方法来延迟bash中变量的计算(做“懒惰评估”)。
带有
${!varname}“间接扩展”表单,它不能移植到其他shell。
eval,它是可移植的,更多用途和明显,但会给你带来麻烦,嗯,不太理想的人检查你的代码;-)因此,我将给出一个可能的解决方案,第一个。
loop(){
local i cnt=$1 cmd=$2 arg=$3
for((i=0;i<cnt;i++)); do "$cmd" "${!arg}"; done
}
mambo(){
printf '%s ' mambo nr "$@"; echo
}
loop 6 mambo i
mambo nr 0
mambo nr 1
mambo nr 2
mambo nr 3
mambo nr 4
mambo nr 5https://stackoverflow.com/questions/64190601
复制相似问题