显示模块文件夹中不带扩展名的文件并将它们添加到数组中。
function toolbox {
array=(`ls "$1" | xargs`)
len=${#array[array{@]}
for (( i=0; i<$len; i++ ))
do
echo "`basename ${array[$1]} .ssh`"
done
}
这将产生所需的结果,但我必须使用 for 循环。
toolbox "module"
答案1
和${var#word}
扩展${var%word}
也适用于数组:
arr=(/dir/dir1/foo.ssh /dir/dir2/bar.ssh )
arr2=("${arr[@]##*/}")
arr2=("${arr2[@]%.ssh}")
printf "%s\n" "${arr2[@]}"
打印foo
和bar
.
然后,该命令替换ls | xargs
将破坏包含空格(即使没有xargs
)或引号(因为xargs
)的文件名。
实际上,您可以仅从一个变量扩展一个全局变量,只需不引用它。就像这样:
array=( $1 )
(尽管IFS
仍然很重要,所以带有空格的模式会被破坏,除非首先将其设置为空字符串。)
不过,如果您只是查找名称以 结尾的文件,则可以在脚本中.ssh
传递一个目录作为参数和 glob for :*.ssh
array=( "$1"/*.ssh )
答案2
脚本:(删除 .ssh 后缀并向每个元素添加 -SSH)
array=(abc.ssh xyz.ssh ssh "q r.ssh s.ssh" "mmm.ssh^Mnnn.ssh")
for e in "${array[@]}"
do
echo ${e%.ssh}"-SSH"
done
输出:
abc-SSH
xyz-SSH
ssh-SSH
q r.ssh s-SSH
nnn-SSH
和"${array[*]}"
:
nnn-SSH xyz.ssh ssh q r.ssh s.ssh mmm.ssh
和 ${array[*]}
:
abc-SSH
xyz-SSH
ssh-SSH
q-SSH
r-SSH
s-SSH
nnn-SSH
缺少“mmm”也就不足为奇了:
$ printf "a^Mb"
b$ echo "a^Mb"
b
$