如何将命令变为变量

时间:2013-11-12 15:53:07

标签: bash shell

这里有一位相对新手。 我正在使用以下命令读取文件:

while read line
 do 
      commands here
done < file

我将这条线分成两部分,用以下

划分
dash_pos=`expr index "$line" -`

dash_pos显然不是常数,这就是我将其变为变量的原因。

我现在可以做以下

Part1=${line:0:$dash_pos -2}
Part2=${line:$dash_pos + 1}

这些命令按预期工作。

有没有办法让字符串操作命令成为变量,例如

Find_Part1=${line:0:$dash_pos -2}
Find_Part2=${line:$dash_pos + 1}

这样

  Part1=$Find_Part1  &   Part2=$Find_Part2

像以前一样工作,但它会允许我做

 Part1=$Find_Part2   &   Part2=$Find_Part1

必要时。

任何帮助将不胜感激,因为我尝试过引号,双引号,括号, 各种组合的大括号和后面的刻度,试图得到这个 上班。 约翰

2 个答案:

答案 0 :(得分:3)

在变量中存储可执行代码远比它值得多麻烦。改为使用函数:

Find_Part1 () {
    printf "%s" "${line:0:$dash_pos -2}"
}

Find_Part2 () {
    printf "%s" "${line:$dash_pos + 1}"
}

Part1=$(Find_Part1)
Part2=$(Find_Part2)

但是,看起来你真正想要的是

while IFS="-" read Part1 Part2; do
   ...
done < file

read命令将line分为Part1Part2

答案 1 :(得分:0)

目前还不清楚为什么你不能只做那个字面上的问题:

# get the parts
Find_Part1=${line:0:$dash_pos -2}
Find_Part2=${line:$dash_pos + 1}

# ... as necessary:

if such and such condition ; then
   Part1=$Find_Part1
   Part2-$Find_Part2
else
   Part1=$Find_Part2
   Part2=$Find_Part1
fi

此外,您可以在必要时交换Part1Part2的值,只需要一个临时变量

if interesting condition ; then
    temp=$Part1; Part1=$Part2; Part2=$temp
fi

在Bash函数中,我们可能会使temp成为本地,以避免名称冲突和名称空间混乱:

local temp