eis*_*son 31 linux parameters bash wildcard
I'm trying to write a bash script that allows the user to pass a directory path using wildcards.
For example,
bash show_files.sh *
Run Code Online (Sandbox Code Playgroud)
when executed within this directory
drw-r--r-- 2 root root 4.0K Sep 18 11:33 dir_a
-rw-r--r-- 1 root root 223 Sep 18 11:33 file_b.txt
-rw-rw-r-- 1 root root 106 Oct 18 15:48 file_c.sql
Run Code Online (Sandbox Code Playgroud)
would output:
dir_a
file_b.txt
file_c.sql
Run Code Online (Sandbox Code Playgroud)
The way it is right now, it outputs:
dir_a
Run Code Online (Sandbox Code Playgroud)
contents of show_files.sh
:
#!/bin/bash
dirs="$1"
for dir in $dirs
do
echo $dir
done
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 47
父shell,一个调用bash show_files.sh *
,扩展*
为您.
在您的脚本中,您需要使用:
for dir in "$@"
do
echo "$dir"
done
Run Code Online (Sandbox Code Playgroud)
双引号可确保正确处理文件名中的多个空格等.
另请参见如何在shell脚本中迭代参数.bash
如果你真的确定要让脚本扩展*
,你必须确保*
将脚本传递给脚本(用引号括起来,就像在其他答案中一样),然后确保它在正确的点上展开在处理中(这不是微不足道的).那时,我会使用一个数组.
names=( $@ )
for file in "${names[@]}"
do
echo "$file"
done
Run Code Online (Sandbox Code Playgroud)
我不经常使用$@
没有双引号,但这是一次或多或少是正确的事情.棘手的部分是它不能很好地处理带空格的外卡.
考虑:
$ > "double space.c"
$ > "double space.h"
$ echo double\ \ space.?
double space.c double space.h
$
Run Code Online (Sandbox Code Playgroud)
这很好.但是尝试将它作为一张外卡传递给脚本......好吧,我们只是说它在那时变得棘手.
如果要$2
单独提取,则可以使用:
names=( $1 )
for file in "${names[@]}"
do
echo "$file"
done
# ... use $2 ...
Run Code Online (Sandbox Code Playgroud)
che*_*ner 10
引用外卡:
bash show_files.sh '*'
Run Code Online (Sandbox Code Playgroud)
或者让你的脚本接受一个参数列表,而不只是一个:
for dir in "$@"
do
echo "$dir"
done
Run Code Online (Sandbox Code Playgroud)
最好直接迭代"$@'
而不是将其分配给另一个变量,以保持其保存自身包含空格的元素的特殊能力.