Shell脚本更改带变量的目录

时间:2013-10-09 19:55:46

标签: linux bash shell unix

我知道这个问题已被多次询问,但我仍然找不到任何好的解决方案。因此,再次询问是否有人可以提供帮助!!

我试图在变量的帮助下在shell脚本中更改我的工作目录。但我每次都得到" No such file or directory"

#!/bin/bash
echo ${RED_INSTANCE_NAME}   <-- This correctly displays the directory name
cd $RED_INSTANCE_NAME       <-- This line gives the error

现在,当我尝试提供实际目录名而不是使用变量时,shell会更改目录而不会出现问题

cd test  <-- No error

有谁知道这里有什么问题?请帮忙!!

6 个答案:

答案 0 :(得分:15)

您的变量包含回车符。试着说:

cd $(echo $RED_INSTANCE_NAME | tr -d '\r')

它应该有效。为了从变量中删除CR,您可以说:

RED_INSTANCE_NAME=$(echo $RED_INSTANCE_NAME | tr -d '\r')

以下将说明问题:

$ mkdir abc
$ foo=abc$'\r'
$ echo "${foo}"
abc
$ cd "${foo}"
: No such file or directory
$ echo $foo | od -x
0000000 6261 0d63 000a
0000005
$ echo $foo | tr -d '\r' | od -x
0000000 6261 0a63
0000004
$ echo $'\r' | od -x
0000000 0a0d
0000002

答案 1 :(得分:7)

尝试

cd "$RED_INSTANCE_NAME"

此外,请确保该路径对执行cd命令的当前目录有意义。

答案 2 :(得分:6)

遇到所描述问题的一种方法是在变量名中加上波浪号(~)。请改用绝对路径或$HOME变量。请注意,使用$HOME需要双引号。

# doesn't work
$ vartilde='~/'
$ cd $vartilde
-bash: cd: ~: No such file or directory

# works
$ varfullpath='/Users/recurvirostridae'
$ cd $varfullpath

# works
$ varwithhome="$HOME"
$ cd $varwithhome

答案 3 :(得分:1)

我不知道你出了什么问题,但我可以提供一条一般建议:

cd "$RED_INSTANCE_NAME"       # Quote the string in case it has spaces.error

你应该几乎总是把“$ VARIABLE”放在引号中。当变量的值包含有趣的东西(如空格)时,这将避免意外。

答案 4 :(得分:1)

您可以使用

检查回车,ANSI转义和其他特殊字符
cat -v <<< "$RED_INSTANCE_NAME"

这将显示echo $RED_INSTANCE_NAME隐藏或忽略的所有字符。

特别是,如果您的错误消息是: No such file or directory而不是bash: cd: yourdir: No such file or directory,则表示您在变量末尾有回车符,可能是从DOS格式的文件中读取它。 / p>

答案 5 :(得分:0)

我遇到了另一个问题。我的“ cd $ newDir”失败了,因为我在脚本中添加了日志记录。显然,如果您将管道添加到任何cd命令中,则它什么都不做或被吞噬。

浪费了3个小时才弄清楚了。

newDir=$oldDir/more/dirs/

cd $newDir #works

cd $newDir | tee -a log #does nothing

cd $newdir | echo hi    #does nothing

因此带有任何管道的cd都不起作用。不知道为什么cd失败。管道意味着完成您执行的命令,然后将所有输出馈送到下一个命令。这是在RHEL 7上的。
我试图记录我所有的命令并击中此错误。想通了我会把它贴出来,以防其他人碰到它。