web-dev-qa-db-ja.com

bashの複数行エイリアス

次のスクリプトがあります。 aが任意の文字列値であり、bがパスであると想定される単純なテストケースです。

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

ただし、。/ sample.shを実行しようとすると、次のエラーが発生します。

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

そして、source sample.shを試してみると、次のようになります:

a: Undefined variable.

私の目的は、これをエイリアスにして、このスクリプトを入手し、エイリアスを実行してコマンド行を実行できるようにすることでした。誰かがこれを見て、エラーを教えてください。

10
Jovin Miranda

ここにいくつか問題があります

  1. cshとは異なり、bash(および他のBourneのようなシェル)では、エイリアスには=記号が割り当てられます。 alias foo=bar

  2. 引用符をそのようにネストすることはできません。この場合、エイリアスを一重引用符で囲み、内部で二重引用符を使用できます

  3. バックスラッシュ\行継続文字です:構文的には、コマンドをsingle行(必要なものの反対)

そう

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

テスト:最初にファイルを入手します:

$ . ./myscript.sh

それから

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

エイリアスをスクリプト内で使用する場合、エイリアスはインタラクティブシェルでデフォルトでのみ有効になっていることに注意してください:スクリプト内でエイリアスを有効にするには追加する必要があります

shopt -s expand_aliases

上記のすべてに関係なく、このようなもののエイリアスではなくシェル関数の使用を検討する必要があります

12
steeldriver

POSIXタイプのシェルで関数を使用することに慣れてください。引用の問題はありません:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}
7
glenn jackman