前提・実現したいこと
シェルスクリプト(bash)のコマンドラインの引数の値からls
でファイルを取ってこようとしています。
しかしコマンドラインの引数からワイルドカード(*)
を使おうとするとその場で展開されてしまうのか上手くいきません。
たとえば
ディレクトリ構造をこのようにした場合
/hoge.txt
/piyo.txt
/script/script.sh
script.shを以下のようにすると
sh
1#!/bin/bash 2IFS=$'\n' 3declare -a command_ls_emb=("$(ls ../* 2>/dev/null)") 4 5for get in ${command_ls_emb[@]} 6do 7 echo "array : $get" 8done
shell
1user:~/test/script$ ./script.sh 2array : ../hoge.txt 3array : ../piyo.txt 4array : ../script: 5array : script.sh 6user:~/test/script$
このlsするための値を引数から得ようとした場合
sh
1#!/bin/bash 2IFS=$'\n' 3declare -a command_ls=("$(ls $1 2>/dev/null)") 4 5for get in ${command_ls[@]} 6do 7 echo "array : $get" 8done
とすると
console
1user:~/test/script$ ./script.sh ../* 2array : ../hoge.txt 3user:~/test/script$
と展開されてしまいます。
考えた対策1
引数で
console
1user:~/test/script$ ./script.sh "../*"
とダブルクオーテーションでくくってやれば大丈夫ですがユーザーに強制するのは優しくありません。
考えた対策2
そこで以下のように記述しても
#!/bin/bash echo $1 echo "double quorts : $1" set -f echo $1 echo "set -f : $1" set +f
それぞれすべて展開されてしまいます。
考えた対策3
取得した引数のディレクトリ判定
ただし
引数で
console
1user:~/test/script$ ./script.sh "../*/x"
とされた場合の抜け道があります。
質問
-
どのようにすればワイルドカード展開をされずにコマンドライン引数の受け渡しをすればいいのでしょうか
-
展開されているのだとは思いますが
../*
ではなぜ1ファイルしか取得できてないのでしょうか? -
2)と被るかもしれませんが、ワイルドカード展開が回避できないとしてワイルドカード展開された等の判定をすることはできるのですか?
-
このような状況の回避手段などがあれば教えてください。
よろしくお願いします。
補足情報
Windows10 Pro
WSL Ubuntu 20.04
bash version 5.0.17(1)-release (x86_64-pc-linux-gnu)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。