我试图为用户提供在不同目录中运行脚本的选项。但是,当脚本更改目录时,该命令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
.
我建议将变量更改为path
or dir
(在 Linux/UNIX 中大小写很重要)。