我的目標是擁有一個包含每個值的特定命令的陣列。然而,為了讓 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"so$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[@]}"
uj5u.com熱心網友回復:
不要將命令存盤在字串中。使用函式。
參考變數擴展。
使用 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[@]}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/417965.html
標籤:
