Linux Shell脚本使用变量更改目录

Linux Shell脚本使用变量更改目录,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我知道这个问题已经被问了很多次,但我仍然找不到任何好的解决办法。因此,再次询问是否有人可以帮忙 我试图在一个变量的帮助下在shell脚本中更改我的工作目录。但是我每次都会得到“没有这样的文件或目录” #!/bin/bash echo ${RED_INSTANCE_NAME} <-- This correctly displays the directory name cd $RED_INSTANCE_NAME <-- This line gives the error

我知道这个问题已经被问了很多次,但我仍然找不到任何好的解决办法。因此,再次询问是否有人可以帮忙

我试图在一个变量的帮助下在shell脚本中更改我的工作目录。但是我每次都会得到
“没有这样的文件或目录”

#!/bin/bash
echo ${RED_INSTANCE_NAME}   <-- This correctly displays the directory name
cd $RED_INSTANCE_NAME       <-- This line gives the error
#/bin/bash
echo${RED\u INSTANCE\u NAME}Try


另外,确保路径指向执行
cd
命令的当前目录

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

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

您几乎应该总是将“$VARIABLE”放在引号中。当变量的值包含有趣的内容(如空格)时,这将防止意外情况发生。

您可以使用

cat -v <<< "$RED_INSTANCE_NAME"

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

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

遇到所述问题的一种方法是在变量名中使用波浪号(
~
)。改用绝对路径或
$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

我遇到了另一个问题。我的“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上的节目。

我试图记录我所有的命令,并点击这个不错的错误。我想我会发布它,以防其他人点击它。

你如何设置
RED\u INSTANCE\u NAME
的值?如果你认为这个问题已经被问过,试着说
cd“${RED\u INSTANCE\u NAME}”
,链接到这些类似的问题并解释为什么答案不适合您可能会很好。您可以像这样使用echo命令来查看var值中是否有任何其他字符:echo“${RED_INSTANCE_NAME}”,我还将
pwd
放入脚本中,以验证脚本是否认为它位于正确的目录中;以及可能的
ls-F
。你所做的应该是可行的,所以它可能是目录名中的空格、大小写混淆、前导/尾随空格(或其他不可打印字符),或者脚本不是从你认为它运行的地方运行的。谢谢你的回答,但我也尝试了这种方法。但是没有帮助。它仍然会给出错误!!是的,我确信我是以正确的方向执行此命令的。您看到的错误是什么?尝试通过“bash-x”运行,看看它执行了什么。感谢您的回答,但我也尝试了这种方式。但是没有帮助。它仍然会给出错误!!谢谢你的指点。我确实在变量的末尾有一个回车符。或者
cd`echo$RED_INSTANCE_NAME | tr-d'\r'`
# doesn't work
$ vartilde='~/'
$ cd $vartilde
-bash: cd: ~: No such file or directory

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

# works
$ varwithhome="$HOME"
$ cd $varwithhome
newDir=$oldDir/more/dirs/

cd $newDir #works

cd $newDir | tee -a log #does nothing

cd $newdir | echo hi    #does nothing