2016-05-18 3 views
0

からシェルの引数を編集する方法:私は2つの引数を渡すことで<code>.sh</code>ファイルを実行する必要があり、CLI

$ file.sh arg1 arg2 
  • 引数1:filename.ext
  • arg2に:filename

を基本的に私拡張子をファイル名から取り除き、2番目の引数として渡す必要があります。

これを達成する方法は?

filename="$1" 
filename_without_extension="${1%\.*}" 
echo "$filename" 
echo "$filename_without_extension" 

出力:

$ ./file.sh filename.txt 
filename.txt 
filename 

、あなたは引数を通過させながら、それを削除したい場合は、変数は以下のようにシェルの中で宣言されている必要があり

+0

は、あなただけの最初の引数を渡すことはできませんスクリプト自体でこれを取り除くのですか? – AKS

+0

@AKSはい、それは別の解決策になります!スクリプト自体でそれを行う方法を理解するのを手伝ってください。 – Luke

答えて

2

file.shファイルには、次のような内容を持っていますこれは:

$ var="filename.ext" 
$ echo ${var%\.*} 
filename 
$ vim script.sh 
$ chmod 755 script.sh 
$ ./script.sh "$var" "${var%\.*}" 
filename.ext filename 
  • ${var%\.*}パターン\.*と一致する最短(文字列の最後にある)部分を$ varから削除します。つまり、0文字以上の文字を続けます。

パラメータ置換の詳細はhereです。

編集:単一の%右からの最短(貪欲でない)一致が削除されるので、ファイル名にドットが含まれていても、ファイル名から拡張子だけが削除されます。ここで

これらのサンプル値で実行されます:

スクリプトのバージョン:

$ cat file.sh 
filename="$1" 
filename_without_extension="${1%\.*}" 
echo "$filename" 
echo "$filename_without_extension" 
$ chmod 755 file.sh 
$ ./file.sh file.name.ext 
file.name.ext 
file.name 

とで、我々はスクリプトに引数を渡す別のバージョン:

$ var="file.name.ext" 
$ cat script.sh 
echo "[email protected]" 
$ chmod 755 script.sh 
$ ./script.sh "${var}" "${var%\.*}" 
file.name.ext file.name 
+0

このソリューションは非常にうまく動作しますが、ファイル名に他の点がある場合はどうなりますか? 'file.name.ext' – Luke

+0

@はい、そういう種類の入力に対してもうまくいくでしょう。 – ritesht93

1
$ var=filename.ext 
$ file.sh ${var%.*} ${var##*.} 
  • ${var%.*} - ショートを削除します。変数var
  • ${var##*.}の右から可能一致\.*パターンをtは - 変数var

の左側から可能な限り長いマッチ*\.パターンを削除します詳細についてはbash variables manglingを参照してください

+0

これは 'file.sh filename ext'に展開されます。これはOPが望んでいないものです。 –

関連する問題