3

単語指定子や単語修飾子などを使用して、bash シェル スクリプトで次のことを自動化するにはどうすればよいですか?

root@server:/tmp# wget -q http://download.zeromq.org/zeromq-2.2.0.tar.gz
root@server:/tmp# tar -xzf !$:t
tar -xzf zeromq-2.2.0.tar.gz
root@server:/tmp# cd !$:r:r
cd zeromq-2.2.0
root@server:/tmp/zeromq-2.2.0#

以下のようなことをしようとすると、エラーが発生します。これは、単語指定子と単語修飾子が、bash スクリプトではシェルと同じようには機能しないように見えるためです。

Bash シェル スクリプトの例 1:

#!/usr/bin/env bash
wget -q http://download.zeromq.org/zeromq-2.2.0.tar.gz && tar -xzf !$:t && cd !$:r:r

root@server:/tmp# ./install.sh 
tar (child): Cannot connect to !$: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now

Bash シェル スクリプトの例 2:

#!/usr/bin/env bash
wget -q http://download.zeromq.org/zeromq-2.2.0.tar.gz
tar -xzf !$:t
cd !$:r:r

root@server:/tmp# ./install.sh 
tar (child): Cannot connect to !$: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now
./install.sh: line 11: cd: !$:r:r: No such file or directory
4

2 に答える 2

4

履歴の置換はコマンドラインで機能します。スクリプトでは、パラメーター展開を使用できます。

#!/usr/bin/env bash
url=http://download.zeromq.org/zeromq-2.2.0.tar.gz
wget -q "$url"
tarfile=${url##*/}        # strip off the part before the last slash
tar -xzf "$tarfile"
dir=${tarfile%.tar.gz}    # strip off ".tar.gz"
cd "$dir"
于 2012-05-23T11:06:28.900 に答える
1

提供されている例が解決しようとしている唯一の問題である場合は、おそらく次の方法が役立ちます。

version="2.2.0"
wget -q http://download.zeromq.org/zeromq-${version}.tar.gz
tar -xzf zeromq-${version}.tar.gz
cd zeromq-${version}

bash スクリプト バージョンでは、スクリプトに渡される最初のオプションになる可能性があります。

version=$1

これにはエラー処理などは含まれていませんが、開始する必要があります。

于 2012-05-23T09:01:28.833 に答える