以下を実行するスクリプトがある場合
[alice]$ math
Enter a number: 5
Number squared: 25
Number divided: 1
Number to power of 3: 125
数学スクリプトの出力をテーブルとして構成しますが、複数の引数を使用して「除数」を表示しない別のスクリプトを作成したいと思います。例えば
[alice]$ newprogram 5 10
*
*Number squared power of 3
5 25 125
10 100 1000
また、数学スクリプトは/home/alice
新しいプログラムが配置されています/home/user
。この問題にどのように対処する必要がありますか?
答え1
私を見て回答既存のスクリプトにパラメータを渡す方法の詳細については、前の質問を参照してください。この出力の解析は、前の出力よりも難しいでしょう。
新しいバージョンをスクリプト化する方がはるかに簡単です。このようにナンセンスを解析することは主なPITAです。
以下は、無関係な出力(ヘッダーなど)を印刷する元のエラーを繰り返すことなくこれを行うバージョンです。
#! /bin/bash
for i in "$@" ; do
printf "%i\t%i\t%i\n" $i $(($i * $i)) $(($i * $i *$i))
done
-v
以下は、(verbose)オプションを使用している場合にオプションでタイトルを印刷するバージョンです。
#! /bin/bash
verbose=0
while getopts "v" opt ; do
case "$opt" in
v) verbose=1 ;;
esac
done
shift "$((OPTIND-1))"
[ "$verbose" = "1" ] && printf "%s\t%s\t%s\n" 'Number' 'Squared' 'Power of 3'
for i in "$@" ; do
printf "%i\t%i\t%i\n" $i $(($i * $i)) $(($i * $i *$i))
done
答え2
質問で「方法」という言葉を使用しています。これは、与えられた答えが「粗い」または多少「一般的な」ものであることを意味するので、この問題を解決するために使用できる次の手順を説明します。
- 書く予想される- スクリプト闘うに送信されます
/home/alice/math
。 /home/user/newprogram
指定されたBASHスクリプトの引数を使用してループからExpectスクリプトを呼び出すBASHスクリプト(例:)を作成するコマンドの置き換え出力をキャプチャします。grep
必要なデータを抽出して変数に保存するなど、お気に入りのテキスト処理ツールを使用します(これを行うには、キャプチャされた出力をにパイプする必要があります。コマンド置換を使用してコマンドに渡されgrep
たデータをキャプチャしてgrep
保存場所に保存する必要があります。 )。変わりやすい)。- このステップ前のステップで解析した変数をテーブルに出力します。
このステップではペアがあると仮定します/home/alice/math
。もちろんそうでない場合は、次のようにすることができます。
/home/alice/math
chmod
権限または所有者のみを使用または変更してくださいchown
。- 両方のユーザーがアクセスできるように十分な権限を持つパブリックグループに
alice
配置します。user
/home/alice/math