Shell脚本更改带变量的目录

Viv*_*vek 14 unix linux bash shell

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

我试图在变量的帮助下更改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
Run Code Online (Sandbox Code Playgroud)

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

cd test  <-- No error
Run Code Online (Sandbox Code Playgroud)

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

dev*_*ull 17

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

cd $(echo $RED_INSTANCE_NAME | tr -d '\r')
Run Code Online (Sandbox Code Playgroud)

它应该工作.为了从变量中删除CR,您可以说:

RED_INSTANCE_NAME=$(echo $RED_INSTANCE_NAME | tr -d '\r')
Run Code Online (Sandbox Code Playgroud)

以下将说明问题:

$ 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
Run Code Online (Sandbox Code Playgroud)


tra*_*ash 10

遇到所描述问题的一种方法是~在变量名中使用tilde().请改用绝对路径或$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
Run Code Online (Sandbox Code Playgroud)


Ale*_*off 7

尝试

cd "$RED_INSTANCE_NAME"
Run Code Online (Sandbox Code Playgroud)

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


小智 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
Run Code Online (Sandbox Code Playgroud)

所以 cd 与任何管道没有任何作用。不知道为什么 cd 失败。管道意味着完成您正在执行的命令,然后将任何输出提供给下一个命令。这是在 RHEL 7 上。
我试图记录所有命令并遇到这个不错的错误。我想我会发布它以防其他人点击它。