bash脚本:echo>>返回错误"没有这样的文件或目录"

时间:2016-04-14 12:52:55

标签: bash shell append echo

为什么不使用此代码?

#!/bin/bash

test="~/.test"

function fn_append () {

    echo "check vars: $1  ···  ${1} ··· $2"
    echo "check comm: echo \"$2\" >> $1"
        #this returns "No such file or directory"
    echo $2 >> $1
    echo $2 >> ${1}
    echo $2 >> "$1"
        #this creates file named $1
    echo $2 >> '$1'
        #this works (but it isn't enough)
    echo $2 >> ~/.test
        #this is the command Im trying to create.
    #echo "alias ll='ls -lstra'" >> ~/.test
}

fn_append ${test} "alias ll='ls -lstra'"

执行输出:

check vars: ~/.test  ···  ~/.test ··· alias ll='ls -lstra'
check comm: echo "alias ll='ls -lstra'" >> ~/.test
./test.sh: line 9: ~/.test: No such file or directory
./test.sh: line 10: ~/.test: No such file or directory
./test.sh: line 11: ~/.test: No such file or directory

该文件确实存在(尽管它不会使脚本无论如何都有效)并且我有权限。该命令适用于终端并在脚本上进行硬编码。失败的是与" $ 1"。

相关的东西

P.D:我知道还有其他方法可以追加文件。我现在一直在使用它们,但我仍然希望修复此代码,或者至少知道它为什么不起作用。

2 个答案:

答案 0 :(得分:6)

变量扩展比波浪扩展晚发生:

  

扩展的顺序是:支撑扩展,波浪扩展,参数,变量          和算术扩展和命令替换(以从左到右的方式完成),          单词拆分和路径名扩展。

(来自man bash,强调我的)

因此,bash不能扩展变量值中的波浪号。如果您确实直接在赋值中赋值,请不要使用引号:波形扩展在指定的值上发生。

test=~/.test

如果文件名需要引用,请将开头保持为引号中的第一个斜杠:

test=~username/'path that/needs quoting'

答案 1 :(得分:0)

下面的表达式不起作用     

test=~"/.test"
给.test文件提供绝对路径的最佳方法。例如     
test="/home/user/.test"