使用变量更改Shell脚本目录

32

我知道这个问题已经被问了很多次,但我仍然找不到任何好的解决方案。因此,如果有人能帮忙再问一次!

我正在尝试使用变量在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

有人知道这里可能出了什么问题吗?请帮忙!!


你是如何设置RED_INSTANCE_NAME值的? - chepner
4
尝试运行 cd "${RED_INSTANCE_NAME}" - devnull
如果您认为这个问题已经被问过了,那么最好链接到那些类似的问题,并解释为什么这些答案对您不适用。 - Adrian Ratnapala
您可以像这样使用echo命令来查看变量值中是否有其他字符:echo "'${RED_INSTANCE_NAME}'" - LMC
我还会在你的脚本中加入pwd来验证脚本是否认为它在正确的目录中;可能还会加入ls -F。你正在做的应该是有效的,所以问题要么是目录名称中有空格、大小写混淆、前导/尾随空格(或其他不可打印字符),要么是脚本没有从你认为的位置运行。 - Chris J
6个回答

34

你的变量包含了回车符。尝试使用以下语句:

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

谢谢指点。我的确在变量末尾有一个回车符。 - Vivek
返回已翻译的文本:cd \echo $RED_INSTANCE_NAME | tr -d '\r'`` - Israel N

29

遇到您描述的问题的一种解决方法是在变量名中使用波浪线(~)。而应该使用绝对路径或$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

我的变量中也有~。感谢您提供的$HOME建议。 - sohammondal

11

尝试

cd "$RED_INSTANCE_NAME"

同时,确保路径与执行 cd 命令的当前目录相关联。


1
谢谢回答,但我也尝试了这种方法。但是没有帮助。它仍然显示错误!!而且,我确定我正在正确的目录中执行此命令。 - Vivek
你看到了什么错误?尝试通过“bash -x”运行以查看它执行了什么。 - Alexander L. Belikoff

5

我遇到了一个不同的问题。“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上发生的。

我试图记录所有命令,但遇到了这个错误。想着将其发布出来以防其他人也遇到同样的问题。


2

您可以使用以下方式检查回车符、ANSI转义和其他特殊字符:

cat -v <<< "$RED_INSTANCE_NAME"

这将显示所有字符,即echo $RED_INSTANCE_NAME会隐藏或忽略的字符。
特别地,如果您的错误信息是: No such file or directory而不是bash: cd: yourdir: No such file or directory,这意味着您的变量末尾有一个回车符,可能是从读取 DOS 格式文件时产生的。

1

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

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

你几乎总是应该将"$VARIABLE"放在引号中。这样可以防止当变量的值包含奇怪的字符(如空格)时出现意外情况。


谢谢回答,但我也尝试了这种方法。但是没有帮助,它仍然显示错误!! - Vivek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接