在bash中有什么方法可以将文字转换为非文字变量?
Is there any way to convert a literal to a non literal variable in bash?
我的目标是拥有一个包含每个值的特定命令的数组。然而,为了让 bash 处理数组,我需要创建被 ''
包围的文字值
当尝试处理数组时,文字值(包括变量语法)将作为其文字名称而不是变量名称进行处理。有没有办法将文字值转换为非文字值?
这是我的意思的一个例子:
#!/bin/bash
dir=C
echo "Non literal"
ls $dir
echo "Literal"
'ls $dir'
echo "variable with literal
cmd='ls $dir'
echo $cmd
echo "$cmd"
$ ./test.sh
Non literal
01_hello_world Modern_C PLE_LinkedIn_Learning_C The_C_Programming_Language
Literal
./test.sh: line 6: ls $dir: command not found
variable with literal
ls $dir
ls $dir
从“文字语句”我希望能够将 'ls $dir'
转换为 "ls $dir"
因此 $dir
被处理为 C
。
这可能吗?
编辑
我想包含我的实际脚本,该脚本将处理数组中的命令列表(我最初的目标):
#!/bin/bash
dir=C
tree_cmd=tree
run_cmds(){
if [[ -z "$@" ]]; then
echo "Array is empty"
else
for i in "$@"; do
$i
done
fi
}
arr=(
'ls $dir'
'cat $dir/01_hello_world'
'$tree_cmd $dir'
)
run_cmds "${arr[@]}"
不要将命令存储在字符串中。使用函数。
引用变量扩展。
使用 shellcheck 检查您的脚本。
#!/bin/bash
dir=C
tree_cmd=tree
run_cmds(){
if ((!$#)); then
echo "No argumetns given"
else
local i
for i in "$@"; do
"$i"
done
fi
}
cmd_1() {
ls "$dir"
}
cmd_2() {
cat "$dir"/01_hello_world
}
cmd_3() {
"$tree_cmd" "$dir"
}
arr=( cmd_1 cmd_2 cmd_3 )
run_cmds "${arr[@]}"
如果您真的想将命令存储在字符串中,例如为了进行简短测试,请忽略一些最佳实践,请参阅 https://mywiki.wooledge.org/BashFAQ/048 。仍然引用变量扩展。你可以这样做:
#!/bin/bash
dir=C
tree_cmd=tree
run_cmds(){
local i
for i in "$@"; do
eval "$i"
done
}
arr=(
'ls "$dir"'
'cat "$dir"/01_hello_world'
'"$tree_cmd" "$dir"'
)
run_cmds "${arr[@]}"
我的目标是拥有一个包含每个值的特定命令的数组。然而,为了让 bash 处理数组,我需要创建被 ''
当尝试处理数组时,文字值(包括变量语法)将作为其文字名称而不是变量名称进行处理。有没有办法将文字值转换为非文字值?
这是我的意思的一个例子:
#!/bin/bash
dir=C
echo "Non literal"
ls $dir
echo "Literal"
'ls $dir'
echo "variable with literal
cmd='ls $dir'
echo $cmd
echo "$cmd"
$ ./test.sh
Non literal
01_hello_world Modern_C PLE_LinkedIn_Learning_C The_C_Programming_Language
Literal
./test.sh: line 6: ls $dir: command not found
variable with literal
ls $dir
ls $dir
从“文字语句”我希望能够将 'ls $dir'
转换为 "ls $dir"
因此 $dir
被处理为 C
。
这可能吗?
编辑
我想包含我的实际脚本,该脚本将处理数组中的命令列表(我最初的目标):
#!/bin/bash
dir=C
tree_cmd=tree
run_cmds(){
if [[ -z "$@" ]]; then
echo "Array is empty"
else
for i in "$@"; do
$i
done
fi
}
arr=(
'ls $dir'
'cat $dir/01_hello_world'
'$tree_cmd $dir'
)
run_cmds "${arr[@]}"
不要将命令存储在字符串中。使用函数。
引用变量扩展。
使用 shellcheck 检查您的脚本。
#!/bin/bash
dir=C
tree_cmd=tree
run_cmds(){
if ((!$#)); then
echo "No argumetns given"
else
local i
for i in "$@"; do
"$i"
done
fi
}
cmd_1() {
ls "$dir"
}
cmd_2() {
cat "$dir"/01_hello_world
}
cmd_3() {
"$tree_cmd" "$dir"
}
arr=( cmd_1 cmd_2 cmd_3 )
run_cmds "${arr[@]}"
如果您真的想将命令存储在字符串中,例如为了进行简短测试,请忽略一些最佳实践,请参阅 https://mywiki.wooledge.org/BashFAQ/048 。仍然引用变量扩展。你可以这样做:
#!/bin/bash
dir=C
tree_cmd=tree
run_cmds(){
local i
for i in "$@"; do
eval "$i"
done
}
arr=(
'ls "$dir"'
'cat "$dir"/01_hello_world'
'"$tree_cmd" "$dir"'
)
run_cmds "${arr[@]}"