2010-12-29 18 views
0

コマンドライン引数(1行目)をとるシェルスクリプトを作成しています。 2行目、awk '{print $ 11}'の結果を出力してCURRENT_TAGに保存したいのですが、 ですが、印刷物$ 11を渡すと、その場所にコマンドライン引数$ 1を自動的に挿入しようとします。どうすればこれを避けることができますか? $の前に\を置くことはできません。

おかげで、

WORKING_COPY=$1; 
CURRENT_TAG=$(ls -l ~/working/svn/$WORKING_COPY/tags/current | grep "current \-\>" | awk '{print $11}'); 
+3

'ls'の出力を解析しようとするのは本当に悪い考えです。理由については、[このリンク](http://mywiki.wooledge.org/ParsingLs)を参照してください。取得したいディレクトリには、正確には何が入っていますか? – SiegeX

+1

皮肉なことに、bashのバグを嫌う - awk引数リストの内容はbashに触れてはいけません。 '9つ以下の引数'のフェチはBourneシェルに戻っています - 元のBourneシェルで$ 11は$ {1} 1を意味しました。 –

答えて

0

スクリプトの修正版は、私のために正常に動作します。あなたはどのようにあなたのスクリプトを実行していますか?何が価値があるために

[email protected]:/tmp$ cat test.sh 
#!/bin/bash 

WORKING_COPY=$1; 
CURRENT_TAG=$(ls -l /tmp/$1 | awk '{print $1}'); 
echo $1 
echo $CURRENT_TAG 
[email protected]:/tmp$ ./test.sh blog.jpeg 
blog.jpeg 
-rw-r--r-- 
[email protected]:/tmp$ bash ./test.sh blog.jpeg 
blog.jpeg 
-rw-r--r-- 

、私ls -l出力は(はスペースとLFS環境変数を含まないファイル名/パスが設定されていない、少なくともで)唯一の8分野、ファイル名という最後を持っています。

+0

余分なフィールドは、ファイルが 'foo - > bar'のようなシンボリックリンクであることが原因です。 –

3

あなたの質問から、現在はシンボリックリンク(または現在の名前のシンボリックリンクを含む現在の名前のディレクトリ)があり、そのリンクが何を参照しているかを調べようとしているようです。これにはreadlinkを使用できます。

CURRENT_TAG=$(readlink ~/working/svn/$WORKING_COPY/tags/current) 

OR

に述べたように
CURRENT_TAG=$(readlink ~/working/svn/$WORKING_COPY/tags/current/current) 
0

、それlsその方法を使用することは悪い考えです。

CURRENT_TAGの内容は、WORKING_COPYの内容と同じになりますが、「1」が付いていますか?

>をエスケープすると、通常の代わりに特別になります。 grep "current ->"を実行する必要があります。

AWKはgrepを使用していることを選択できます。

awk '/current ->/{print $11}' 
+0

また、 '$ 11'の代わりに' $ NF'を使用すると、意図が明確になり、スクリプトの読者に 'ls -l'の出力にあるフィールドを数えさせることを避けます。 –

関連する問題