[解決済み] シェル文字列不正置換
質問内容
シェルプログラミングの初心者です。ZIPファイルを解凍した後のディレクトリ名を取得するつもりです。そのためのprint文は
$test.sh helloworld.zip
helloworld
それでは、test.shを見てみましょう。
#! /bin/sh
length=echo `expr index "$1" .zip`
a=$1
echo $(a:0:length}
しかし、コンパイラからBad substitutionエラーが発生しました。
私はUbuntu 10.04を使用しており、ターミナルを使用しているため、bashや他のシェルの違いがわかりません。(私はbashを使っています。)
解決方法は?
シェルが十分に新しいバージョンである場合
bash
は、その
パラメータ展開
という表記が有効なはずです。
他の多くのシェルでは、これは動作せず
bad substitution
エラーは、シェルが「あなたはパラメータ置換を要求しましたが、私には意味をなしません」と言う方法です。
また、スクリプトを考えると
#! /bin/sh
length=echo `expr index "$1" .zip`
a=$1
echo $(a:0:length}
2行目は、変数
length
という値で
echo
を実行することで生成されるコマンドに対して
expr index "$1" .zip
. には代入されません。
length
. で済むはずです。
length=$(expr index "${1:?}" .zip)
ここで
${1:?}
の場合、エラーが発生します。
$1
が設定されていない場合 (スクリプトが引数なしで起動された場合)。
最後の行は、こうでなければなりません。
echo ${a:0:$length}
ただし、もし
$1
は
filename.zip
の出力は
expr index $1 .zip
は2なので、文字
i
のインデックス2に出現する。
filename.zip
. を使わずにファイルのベース名を取得することを意図している場合、そのファイルには
.zip
という拡張子を付けると、古典的な方法となります。
base=$(basename $1 .zip)
と、より現代的な方法です。
base=${1%.zip}
違いは、名前が
/path/to/filename.zip
の場合、古典的な出力は
filename
であり、現代のものは
/path/to/filename
. でクラシックな出力が得られます。
base=${1%.zip}
base=${base##*/}
また、クラシック版では、パスで取得します。
base=$(dirname $1)/$(basename $1 .zip)`.)
ファイル名にスペースが含まれる場合は、ダブルクォートを使うことを考える必要があります。
basename
と
dirname
.
関連
-
[解決済み] Goで複数行の文字列はどのように書くのですか?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】動的構造体参照の引数は、有効なフィールド名で評価する必要がある
-
[解決済み] strconv.Atoi()で文字列を指定するとエラーが発生する。
-
[解決済み] Mips ユーザー入力文字列の保存方法
-
[解決済み] 文字列を連結する方法を教えてください。
-
[解決済み] Luaで文字列がnilまたは空でないかをチェックする
-
[解決済み] time.Timeを文字列に変換する
-
[解決済み】Scala:文字列のイテラブルを結合する
-
[解決済み】「改行」と「キャリッジリターン」の違いは?
-
[解決済み] sqliteでパディングを含む文字列を連結する方法
-
[解決済み】Bashでファイルに文字列が存在するかどうかをテストする方法は?