特殊パラメータクエリ - コマンド名を取得するためのマルチクエリ? [コピー]

特殊パラメータクエリ - コマンド名を取得するためのマルチクエリ? [コピー]

Bashスクリプトで提供されたuniテキストでは、次の変数の割り当てが妨げられ、まだ誰からも返信を受けていません。ここで誰かが助けてくれることを願っています。

name=${0##*/}  

入力したコマンドの名前を指定するには、それを拡張する必要があります。中かっこ内の最初の文字は0なので、パラメータ$ 0からこの値を取得する方法がわかります。ところで、前のページの情報(対応するuniドキュメント)とこれまでオンラインで見たソースによると、#はスクリプト呼び出し時に使用する引数の数を表し、*は引数を文字列として含んでいます。どのようにこれらの特別なパラメータがすべてパラメータ$ 0に拡張されるのか理解できません。

名前を次のように拡張したいと思います: code/script2 3 3 code/script2 fred george allison.

誰かが中括弧の間の各特殊パラメータが名前:code / script2に拡張される役割を説明できる場合は、本当に感謝します。

助けてくれてありがとう!

以下は、コンテキストの完全なスクリプトと出力です。

1  #!/bin/bash
2  # A simple script showing some of the special variables
3
4 echo "The full name of this script is $0" 
5
6 name=${0##*/}
7
8 echo "The name of this script is $name"
9
10 echo "The process ID of this script is $$"
11
12 echo "This script was called with $# parameters" 13
14 echo "The parameters are \"$*\""
16  echo "Parameter 1 is - $1"
17  echo "Parameter 2 is - $2"
18  echo "Parameter 3 is - $3"

prompt: code/script2 fred george allison
The full name of this script is code/script2 
The name of this script is script2
The process ID of this script is 3501
This script was called with 3 parameters The parameters are "fred george allison"
Parameter 1 is - fred
Parameter 2 is - george
Parameter 3 is - allison 

答え1

あなたは混乱しています${#var}(これは戻ります長さvar) 戻り${var##substr}値はvar次の後に返されます。最長のプレフィックス一致を削除 substr

この場合、部分文字列は*/呼び出しスクリプト名のすべての先行パスコンポーネントであり、最終ファイル名コンポーネントのみを残しますscript2。どちらの式もこの文字を使用しますが、#場所は#重要です。

${var#substr}表面的にはより近いように見えますが、削除後に${#var}値を返す値もあります。var最短プレフィックスと一致します。

例を見る文字列の一部を削除

関連情報