首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何给Bash中的脚本提供一个神奇的变量

如何给Bash中的脚本提供一个神奇的变量
EN

Stack Overflow用户
提问于 2020-10-04 02:14:06
回答 2查看 175关注 0票数 3

如何给脚本一个神奇的变量(占位符)?

让我们有一个loop脚本:

代码语言:javascript
复制
#!/bin/bash

count=$1
shift

for i in $(seq 1 $count)
do
    $*
done

我想这样称呼它:

loop 5 echo Mambo number $i

但是,Bash在脚本调用之前扩展变量并生成:

代码语言:javascript
复制
Mambo number
Mambo number
Mambo number
Mambo number
Mambo number

如果我这么说:

loop 5 echo Mambo number '$i'

变量不会在脚本中展开。

代码语言:javascript
复制
Mambo number $i
Mambo number $i
Mambo number $i
Mambo number $i
Mambo number $i

在bash中有使用神奇变量的聪明方法吗?

我要做到:

代码语言:javascript
复制
Mambo number 1
Mambo number 2
Mambo number 3
Mambo number 4
Mambo number 5

还包括:

loop 3 touch 'foo-$i.log'

要创建三个文件:

代码语言:javascript
复制
foo-1.log
foo-2.log
foo-3.log
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-04 02:50:13

看来你想证明你的论点

代码语言:javascript
复制
#!/bin/bash
    
count=$1
shift
    
for i in $(seq 1 $count)
do
    eval "$@"
done

您必须保护以后要展开的所有变量。

代码语言:javascript
复制
bash loop.sh 3 echo test '"$i"'
test 1
test 2
test 3

或者最好将单引号中的整个字符串保护为一个字符串参数。

代码语言:javascript
复制
bash loop.sh 3 'echo "$i" "$((i+1))"  $(bc -l <<< "$i+2")'
1 2 3
2 3 4
3 4 5

小心点。

票数 1
EN

Stack Overflow用户

发布于 2020-10-04 02:51:20

我可以想出两种方法来延迟bash中变量的计算(做“懒惰评估”)。

带有

  1. ${!varname}“间接扩展”表单,它不能移植到其他shell

  1. eval,它是可移植的,更多用途和明显,但会给你带来麻烦,嗯,不太理想的人检查你的代码;-)

因此,我将给出一个可能的解决方案,第一个。

代码语言:javascript
复制
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 5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64190601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档