在参数中指定尝试使用CWD(如果不是目录)

时间:2015-10-10 19:52:44

标签: shell unix

我正在编写一个脚本来重命名目录中的一堆文件。这就是我到目前为止所做的:

cd /$1/
if [ -z "$1" ]
  then
    cd $PWD
fi

所以我试图告诉脚本在参数中提供的路径中运行,或者如果没有提供参数来使用当前工作目录。

我在if部分尝试了很多变种:

if [ -z "$1" ]
  then
    cd $CWD

以及使用pwd和cwd的各种其他东西,但它只是不起作用。我一直没有这样的文件或目录。

请帮忙!

2 个答案:

答案 0 :(得分:0)

通过使用变量插值,您可以在没有if的情况下执行此操作,如下所示:

$PWD

由于cd总是绝对的,如果使用它,它前面有两个斜杠。但这对{{1}}无关紧要。

答案 1 :(得分:0)

  

所以我试图告诉脚本在参数中提供的路径中运行,或者如果没有提供参数来使用当前的工作目录。

由于您不知道提供的路径是绝对路径还是相对路径,因此在目标目录前面加斜杠可能会导致失败。如果您想使用参数扩展,我建议如下:

cd "${1:-.}"

这将更改为提供的路径,相对或绝对路径,并且不会在包含空格的名称上失败。如果未提供$1(并解析为空或null),则变量将扩展为一个点,该点始终引用当前目录。

那就是说,我对if没有问题。它们有助于检测错误。我认为以下内容可以实现您的目标:

if ! cd "${1:-.}"; then
  echo "ERROR: couldn't change to '$1'" >&2
  exit 1
fi

这是上面的cd,但如果失败(例如由于权限问题或路径不存在),则脚本报告错误(对stderr,因此{{1} })并退出。否则(>&2成功),脚本现在发现自己在新位置。

此外,我建议不要使用cd,因为它是变量,并且可以被覆盖。例如:

$PWD

虽然[ghoti@pc ~]$ pwd /home/ghoti [ghoti@pc ~]$ PWD=/tmp [ghoti@pc /tmp]$ echo $PWD /tmp [ghoti@pc /tmp]$ pwd /home/ghoti [ghoti@pc /tmp]$ 变量被用于一堆事情,但我建议不要依赖它,除非你自己设置在脚本的顶部。

$PWD

另外,请记住引用您的变量。

PWD=$(pwd)