
このオープンソースのbashスクリプトを実行しようとしていますが、入力を解析するときにLinuxを実行すると仮定するため、これはうまくいきません。実際、私はWindowsシステムでcygwinを実行しています。スクリプトに$ IFSをに設定した場所があります。\n
これは残ります。\r
これは正しい文字列と一致しないため、エラーが発生します。
ローカルバージョンのスクリプトを変更するのは簡単ですが、すべてのオペレーティングシステムで実行できるようにするにはどうすればよいですか?いくつかのコマンドを実行して改行文字を取得できる場合は、それを$ IFSに割り当てることができます。
追加のコンテキストのために改行を処理するコードは次のとおりです。
IFS=\n
# Word splitting is intended here
# shellcheck disable=2046
set -- $(printf '%s\n' "$_response" | jq -r '
.error,
.access_token,
.token_type,
.expires_in,
.refresh_token,
.scope')
IFS=$oifs
[ "$1" = "null" ] && ...
テストは "null\r" を "null" と比較することで終了します。
答え1
台本には
$IFS
[\n
...]
示したコードはIFS=\n
。残念ながらこれはそうではなく、IFS='\n'
最終的には設定されますIFS=n
。だからとにかくコードを修正する必要があります。
答え2
動作できるもう1つのオプションは、システムが使用する行終端を決定するのではなく、入力ファイルで使用する行終端に焦点を当てることです。
これは、ファイルの作成中または後処理(または同様の方法)を介してファイルの行末を変更することが(プログラミング方法で)非常に簡単であるためですdos2unix
。
このfile
コマンドを使用して、ファイルが使用する行の末尾に関するいくつかの情報を提供できます。
tim@chaos:~/tmp$ file lnx.txt
lnx.txt: ASCII text
tim@chaos:~/tmp$ file win.txt
win.txt: ASCII text, with CRLF line terminators
tim@chaos:~/tmp$ dos2unix -n win.txt win2unix.txt
dos2unix: converting file win.txt to file win2unix.txt in Unix format...
tim@chaos:~/tmp$ file win2unix.txt
win2unix.txt: ASCII text
したがって、入力ファイルをインポートするスクリプトを設定して、さまざまな行の終わりを確認し、すぐに変更するか、単に入力ファイルをインポートしますdos2unix
。
違いは単なる\r\n
比較です\n
。したがって、シェルスクリプトで入力ストリームを処理すると、ファイル変換なしでCRLF型の行末をキャプチャできます。
ただし、シェルスクリプトはファイルを1行ずつ読み取って処理することを選択するため、追加のsed
手順を追加できます。
次のことができます。
IFS=\n
# Word splitting is intended here
# shellcheck disable=2046
set -- $(printf '%s\n' "$_response" | sed -e s'/\r//g' | jq -r '
.error,
.access_token,
.token_type,
.expires_in,
.refresh_token,
.scope')
IFS=$oifs
[ "$1" = "null" ] && ...
CRLFが存在する場合は削除され、存在しない場合は入力行は変更されません。
スクリプトが入力時に他の行末を自動的に変換するようにすることで、ファイルにどの種類の行末があるかは実際には重要ではなく、スクリプトの移植性が向上します。または、少なくとも入力に拘束されません。