以有效的方式修剪数组中文件的扩展名

以有效的方式修剪数组中文件的扩展名

显示模块文件夹中不带扩展名的文件并将它们添加到数组中。

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[@]}"

打印foobar.

然后,该命令替换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
$ 

相关内容