一つ古代initramfs 内のバージョンでは、ipconfig
ユーザー入力がコロンで区切られた要素を最大 7 個だけ提供する必要があります。たとえば、次のようになります。
ip=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf
ipconfig
ユーザーが7つ以上の要素を提供すると、エラーが発生します。
したがって、追加(2つのDNSリゾルバ)をカットする必要があります。
subshell
たとえば、次のように内部でこれを実行できますcut
。
validated_input=$(echo ${user_input} | cut -f1,2,3,4,5,6,7 -d:)
パラメータ拡張/代替を使用してcut
このようなコードをどのように記述できますか?(b)ash
いいえ:
- サブシェル/サブプロセスの開始(パイプライン)
- IFS - 引数/破壊
(1) 速度以降参照Cut/awk の代わりに bash 変数置換を使用する(2) 学習。
つまり、n(7番目)の文字が見つかり、そこから文字列の終わりまですべてを削除/切り捨てるにはどうすればよいですか?
ベストアンサー1
これはパラメータ拡張のみを使用します。
${var%:"${var#*:*:*:*:*:*:*:}"}
はい:
$ var=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf:morefields:another:youwantanother:haveanother:
$ echo "${var%:"${var#*:*:*:*:*:*:*:}"}"
client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf
末尾の修正を提案したilkkachuに感謝します:
!
${parameter#word}
${parameter##word}
ファイル名拡張と同様に、単語が拡張されてパターンが生成されます(ファイル名拡張子を参照)。パターンがパラメータ拡張値の先頭に一致する場合、拡張結果は、最短一致パターン(「#」の場合)または最長一致パターン(「##」の場合)を持つパラメータ拡張値になります。削除されました。パラメータが「@」または「の場合'を使用すると、各位置引数にパターン除去操作が順番に適用され、拡張が結果リストになります。パラメータが配列変数の場合、下付き文字は「@」または「'を実行すると、配列の各メンバーにパターン削除操作が順番に適用され、拡張が結果リストになります。
これはマッチを試みますスタートパラメータがあると削除されます。
はい:
$ var=a:b:c:d:e:f:g:h:i
$ echo "${var#a}"
:b:c:d:e:f:g:h:i
$ echo "${var#a:b:}"
c:d:e:f:g:h:i
$ echo "${var#*:*:}"
c:d:e:f:g:h:i
$ echo "${var##*:}" # Two hashes make it greedy
i
${parameter%word}
${parameter%%word}
ファイル名拡張と同様に、単語を拡張してパターンを生成します。パターンがパラメータ拡張値の末尾の部分と一致する場合、拡張結果は、最短一致パターン(「%」ケース)または最長一致パターン(「%%」ケース)を持つパラメータ値を削除します。パラメータが「@」または「の場合'を使用すると、各位置引数にパターン除去操作が順番に適用され、拡張が結果リストになります。パラメータが配列変数の場合、下付き文字は「@」または「'を実行すると、配列の各メンバーにパターン削除操作が順番に適用され、拡張が結果リストになります。
これはマッチを試みます終わりパラメータがあると削除されます。
はい:
$ var=a:b:c:d:e:f:g:h:i
$ echo "${var%i}"
a:b:c:d:e:f:g:h:
$ echo "${var%:h:i}"
a:b:c:d:e:f:g
$ echo "${var%:*:*}"
a:b:c:d:e:f:g
$ echo "${var%%:*}" # Two %s make it greedy
a
だから答えは次のようになります。
${var%:"${var#*:*:*:*:*:*:*:}"}
${var#...}
(末尾から削除するリテラル文字列(パターンではなく)として扱われるように、二重引用符に注意してください$var
。)
適用対象:
var=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf:morefields:another:youwantanother:haveanother:
${var#*:*:*:*:*:*:*:}
=morefields:another:youwantanother:haveanother:
内部拡張${var%: ... }
は次のとおりです。
${var%:morefields:another:youwantanother:haveanother:}
だからあなたは私にこう言っています。
client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf:morefields:another:youwantanother:haveanother:
しかし、:morefields:another:youwantanother:haveanother:
先端を切ってください。
Bashリファレンスマニュアル(3.5.3)