効率的な方法で配列のファイル拡張子をトリミングします。

効率的な方法で配列のファイル拡張子をトリミングします。

モジュールフォルダに拡張子のないファイルを表示し、配列に追加します。

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破棄します。xargsxargs

実際、次のように変数からグローバル変数を拡張できます。いいえ引用してみてください。このように:

array=( $1 )

IFSまだ重要ですが、最初に空の文字列に設定しないと、空白のあるパターンが壊れます。)

ただし、名前が終わるファイルのみを探している場合は、次のスクリプトに.sshディレクトリを引数として渡し、globを渡すことができます。*.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
$ 

関連情報