Bash变量赋值
我有一个在~/.config中编辑配置文件的基本脚本-它可以与Bash变量赋值,bash,variables,Bash,Variables,我有一个在~/.config中编辑配置文件的基本脚本-它可以与cd行一起工作,但这似乎是多余的: dir=$HOME/.config/$1 if [ ! -d "$dir" ]; then : else cd "$dir" && for file in * ; do case "$file" in conf | config | *.cfg | *rc) $EDITOR "$file" ;; *) : ;;
cd
行一起工作,但这似乎是多余的:
dir=$HOME/.config/$1
if [ ! -d "$dir" ]; then :
else
cd "$dir" &&
for file in * ; do
case "$file" in
conf | config | *.cfg | *rc) $EDITOR "$file" ;;
*) : ;;
esac
done
cd - 1>/dev/null;
fi
将其更改为使用变量“$dir”失败。我做错了什么
dir=$HOME/.config/$1
if [ ! -d "$dir" ]; then :
else
for file in "$dir" ; do
case "$file" in
conf | config | *.cfg | *rc) $EDITOR "$file" ;;
*) : ;;
esac
done;
fi
您没有对
$dir
中的文件进行全局搜索,只列出了$dir
本身。尝试$dir/*
您的第一个版本在目录上执行*
,生成目录中所有文件的列表。您的第二个版本在列表中只有一个条目——目录本身,而不是它的内容。您不能只使用“$dir”,因为它只提供一个条目:目录。您需要$dir/*,但其中也包括路径,因此您必须去掉它以仅比较文件名:
...
for file in $dir/*; do
filename=`basename $file`
case $filename in
...
精确地比我快。:-)谢谢你,这很有效。有什么东西我能读得更透彻一些吗?@Eduard:恐怕我不能给你指出一个很好的资源。我所知道的关于shell脚本的大部分内容,我都是在飞行中学习的。我不得不在谷歌上搜索“basename”命令,因为我记不起来了:)基本上,“for”会遍历“in”之后的所有文件。$dir/*扩展为“$dir”所在目录中所有文件的列表。如果$dir是/foo/bar,并且其中有一个名为“baz”的文件,那么在循环中,$file的值将为/foo/bar/baz。
basename
命令将删除路径并为您提供“baz”。这解释了吗?那很好。谢谢。你到底为什么要写if[!-d“$dir”];然后:;else cd“$dir”…
而不是简单的if[-d“$dir”];然后cd“$dir”…
?@glenn谢谢你:无知。纯粹而简单。