在 shell 脚本中使用 -d 更改目录

在 shell 脚本中使用 -d 更改目录

我试图为用户提供在不同目录中运行脚本的选项。但是,当脚本更改目录时,该命令mkdir不起作用。我这样更改目录:

case $1 in
 "-d")
   PWD=$2;;
   *)
     ;;
esac

但是当我运行脚本时,它会在它存在的目录中运行。它不会更改目录。

这是完整的代码:

#!/bin/bash
#File sorter
set -e    # Abort in case of error
START=$(date +"%T")
SAVEIFS=$IFS
case $1 in
    "-d")
      PWD=$2;;
    *)
      ;;
esac
echo "trigger took place in $PWD"
for i in *; do
  echo "processing \"$i\" ..."
  case $i in
    *.zip)
      [ -d archive ] || mkdir archive
      mkdir "archive/${i%.*}"
      unzip -d "archive/${i%.*}" "./$i"
      echo -e "\"$i\" extracted in $PWD/archive/${i%.*}" >> report.txt;;
    *.*)
      mkdir -p "${i##*.}"
      mv -- "$i" "${i##*.}/"
      echo -e "\"$i\" moved to $PWD/${i##*.}" >> report.txt;;
    *)
      tmp=$(TMPDIR=. mktemp -d)
      mv -- "$i" "$tmp/"
      mv -- "$tmp" "$i";;
  esac
done
echo "Done in $SECONDS seconds!"
END=$(date +"%T")
echo "Start time: $START" >> report.txt
echo "End time: $END" >> report.txt

答案1

PWD对于改变没有任何作用,我并不感到惊讶。

只需做一个cd "$2"

但是当我运行脚本时,它会在它存在的目录中运行。

它在执行它的 shell 的工作目录中运行。如果您在脚本的目录中,那么是的,它将在那里执行。

答案2

PATH变量保留用于查找 shell 将使用的程序。它是一个目录列表,用冒号 ( :) 分隔,按顺序搜索直到找到程序。从联机帮助页bash

小路

命令的搜索路径。它是一个以冒号分隔的目录列表,shell 在其中查找命令(请参阅下面的命令执行)。 PATH 值中的零长度(空)目录名指示当前目录。空目录名称可能显示为两个相邻的冒号,或者开头或结尾的冒号。默认路径与系统相关,由安装 bash 的管理员设置。常见的值为“/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin”。

如果更改该变量,它会更改 shell 查找程序的方式,例如mkdir.

我建议将变量更改为pathor dir(在 Linux/UNIX 中大小写很重要)。

相关内容