在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[@]}"