在变量中使用正斜杠

时间:2012-09-18 13:51:34

标签: bash slash

我编写了一个脚本来简化Android源的同步和构建。我尝试添加一个函数来cherrypick补丁,但我无法让它正常工作。我知道这是因为正斜杠,但我不知道如何保护/逃脱它们。

部分代码是:

   echo "Copy/paste the project folder, i.e. 'frameworks/base'"
   read folder
   echo ""
   echo "Now paste the cherry-pick git link, i.e. 'git fetch <someproject> refs/changes/... && git cherry-pick FETCH_HEAD'"
   read cherry
   echo ""
   Begin
   clear
   echo ""
   export IFS="&&"
   for x in $cherry
   do
        cd ${CM}/${folder}
    CHERRY=$(trim "$x")
    $CHERRY
   done

让我们说'cherry'变量是:

git fetch http://r.cyanogenmod.com/CyanogenMod/android_frameworks_base refs/changes/68/22968/2 && git cherry-pick FETCH_HEAD

我会收到此错误:

/home/tristan202/bin/build_cm.sh: line 159: git fetch http://r.cyanogenmod.com/CyanogenMod/android_frameworks_base refs/changes/91/23491/2: No such file or directory
/home/tristan202/bin/build_cm.sh: line 159: git cherry-pick FETCH_HEAD: command not found

我无法弄清楚它失败的原因。

它调用的'trim'函数是一个修剪前导和尾随空格的函数。如果我在for循环中回显“$ CHERRY”,命令会正确打印,但仍然会失败。

2 个答案:

答案 0 :(得分:3)

我将再举一个例子:

cmd='echo hello && echo world'
$cmd

结果是:

hello && echo world

bash将命令$cmd解析为Simple Commands而非Lists of CommandsParameter Expansion之后,&&作为参数传递给echoWord Splitting之后的第一个字)。


解决方案是将&&拉出来:

cmd1='echo hello'
cmd2='echo world'
$cmd1 && $cmd2

答案 1 :(得分:0)

&&放入变量后,它将不再被解释为分离两个命令:

$ A="echo a && echo b"
$ echo $A
echo a && echo b
$ echo c && ${A}
c
a && echo b

因此,您需要避免将&&放入变量。

git甚至告诉你&&是错误信息中的问题。

相关问题