![このコードにはどのような問題がありますか? [閉鎖]](https://linux33.com/image/8191/%E3%81%93%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E5%95%8F%E9%A1%8C%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
コードは次のとおりです。
cm=$1
nm=$2
case $cm in
"out")
declare -a en
declare -a inf
ec=$(grep -n "! " hw1_out_si_wire.txt)
IFS=$'\n' en=($ec)
lst=$((${#en[@]} -1))
IFS=' ' inf=($en[$lst])
echo " Energy: ${inf[4]} ${inf[5]}"
;;
"in") echo "It's not my problem";;
esac
$enの7番目の要素を取得しようとしていますが、結果は次のようになります。
[7]ergy: -1090.13343774 Ry
$en 配列は ;
! total energy = -1090.13343774 Ry
! total energy = -1090.20757070 Ry
! total energy = -1090.24296462 Ry
! total energy = -1090.25563488 Ry
! total energy = -1090.27085564 Ry
! total energy = -1090.27693129 Ry
! total energy = -1090.28213580 Ry
! total energy = -1090.29131927 Ry
もしそうなら、このコードにどのような問題がありますか?出力はなぜこのようになりますか?
注:提供された情報が十分でない場合はお知らせください。
答え1
実は何か可能あなたがそれをやってもbash
それをしなければならないか、良い考えであることを意味するわけではありません。あなたがしたいawk
ことはperl
。
Bash配列はbashをかなり高度な方法で使用するものであり、bash / sh言語自体の制限(および使用の不便さ)のために他の言語の配列ほど有用ではありません。複数の引数をコマンドや関数に渡すのに適していますが、それ以外は使用が制限されます。
bash配列を使用する代わりにawk
。
たとえば、
#! /bin/sh
cm="$1"
nm="$2"
case "$cm" in
out) awk -F'[[:space:]]+' '
/^!/ {
c++;
if (c==7) {
print " Energy:",$5,$6;
};
};' hw1_out_si_wire.txt ;;
in) echo "It's not my problem" ;;
esac
出力:
Energy: -1090.28213580 Ry
含まれているawk
スクリプトはaで始まる各行の数を数え!
、7行に達すると5番目と6番目のフィールドを印刷します。
この-F
オプションは、フィールド区切り文字を1つ以上の空白文字(スペース、タブ、改行、キャリッジリターン、フォームフィード、垂直タブ)に設定します。私のコメントに使用されたバージョン[\r[:blank:]]+
(スペース文字、スペース、タブ、キャリッジリターン)。入力データについても同様に動作します。
awk
バージョンが正規表現フィールド区切り文字をサポートしていない場合(たとえば)、コマンドラインmawk
からその区切り文字を削除します。それでも動作しますが、入力ファイルがUnixテキストファイル(改行のみを使用する)ではなくMS-DOS / Windowsテキストファイル(キャリッジリターンと改行を行終端として使用)の場合は、次のようになります。キャリッジリターン文字を出力します。パイプしないと、キャリッジリターン文字は表示されません。-F'[[:space:]]+'
awk
cat -v
Energy: -1090.28213580 Ry^M
その場合は、まずファイルをUnix形式に変換してくださいfromdos
。
答え2
問題の一部は、配列にen
誤ってインデックスを付けていることです。配列にインデックスを付けるときは、中かっこを使用する必要があります
。
$en[$lst]しかし、
${zh[$lst]}