【问题标题】:Shell script change directory with variable带有变量的 Shell 脚本更改目录
【发布时间】:2013-10-09 19:55:45
【问题描述】:

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

我正在尝试借助变量更改 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的值的?
  • 试试说cd "${RED_INSTANCE_NAME}"
  • 如果您认为这个问题已经被问过,最好链接到那些类似的问题并解释为什么答案不适合您。
  • 你可以像这样使用 echo 命令来查看 var 值中是否有其他字符: echo "'${RED_INSTANCE_NAME}'"
  • 我还将pwd 添加到您的脚本中,以验证脚本是否认为它位于正确的目录中;也可能是ls -F。您所做的应该可以工作,因此它可能是目录名称中的空格、大小写混淆、前导/尾随空格(或其他不可打印的字符),或者脚本没有从您认为它运行的位置运行。

标签: linux bash shell unix


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我遇到了另一个问题。我的“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 上。
    我试图记录我所有的命令并遇到这个不错的错误。我想我会发布它以防其他人点击它。

    【讨论】:

      【解决方案3】:

      你的变量包含一个回车。试着说:

      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
      

      【讨论】:

      • 感谢您的指点。我确实在变量末尾有一个回车。
      • cd `echo $RED_INSTANCE_NAME | tr -d '\r'`
      【解决方案4】:

      试试

      cd "$RED_INSTANCE_NAME"
      

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

      【讨论】:

      • 感谢您的回答,但我也尝试过这种方式。但没有帮助。它仍然给出错误!是的,我确定我在正确的目录中执行此命令
      • 您看到的错误是什么?尝试通过“bash -x”运行看看它执行了什么。
      【解决方案5】:

      您可以使用

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

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

      特别是,如果您的错误消息是 : No such file or directory 而不是 bash: cd: yourdir: No such file or directory,这意味着您的变量末尾有一个回车,可能是从 DOS 格式的文件中读取的。

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • 感谢您的回答,但我也尝试过这种方式。但没有帮助。它仍然给出错误!
        猜你喜欢
        • 1970-01-01
        • 2014-08-06
        • 2014-04-12
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多