ファイル名の配列を作成しようとしているので、大きなファイルを並べ替えて、必要なファイルのみを取り出すことができます。私のスクリプトは次のようになっています set STATIONS = Kanto-station-names
「関東駅名」フォルダには、必要なファイル名があります。これにはmyarr=($(awk '{print $1}') $STATIONS)
が続きますが、端末はすぐにサブシェルに入ります。サブシェルは、コマンドが機能せず終了できない作業ドキュメントのように見えます。助言がありますか?bash配列を修正するにはどうしたらいいですか?
答えて
ファイル名のリストを取得するためにfindコマンドを使用して配列を作成するだけではどうですか?
例:
#!/bin/bash
IFS=$'\n'
MyArr=($(find /location/to/Kanto-station-names/ -type f -print0 | xargs -0 ls))
echo ${MyArr[@]}
echo ${MyArr[1}
echo ${MyArr[2}
echo ${MyArr[3}
どうしてですか?それは完全に壊れているので!ファイル名にスペース、改行、またはグロブ文字が含まれている場合は壊れます。 –
@gniourf_gniourfあなたは絶対に正しいです。これは良いですか? – bluerojo
まあ...それはまだ壊れている!あなたはまだパス名の拡張を受けています(これは 'set -f'で修正できます)。それでも改行を含むファイル名では壊れています(これはこのメソッドでは修正できません)。そのようなコマンドを解析することは、実際には常に悪い考えです。しかし、あなたが_really_(GNU) 'find'を100%安全な方法で使用したいなら、これを実行してください:' MyArr =();一方、IFS = read -r -d "ファイル。 do MyArr + =( "$ file"); done <<(find/location/to /関東駅名/ -type f -print0) 'となります。 –
あなたの質問は理解することは難しいですが、あなただけの関東・ステーション名のディレクトリ内のすべてのファイル名の配列を作成したい場合は、これは(仕事 "をリードすることに注意すべきです
$ echo ${myArray[0]}
$ echo ${myArray[1]}
:あなたは、配列の要素にアクセスすることができ、その後
$ myArray=()
$ for FILE in `ls Kanto-station-names` ; do myArray+=($FILE) ; done
:$」はユーザーが入力するプロンプトではなく、何か)であります
など は、配列のすべての要素を表示するには:ノートの
$ echo ${myArray[@]}
[ls'を解析しないでください](http://mywiki.wooledge.org/ParsingLs)。 –
@gniourfファイル名のいずれかに空白が含まれていると、上記はうまくいきません。あなたがリンクしたその例でも、ファイル名に改行が入っていて、それは恐ろしいことです。つまり、私はいつも「ls」を何の問題もなく解析します。私は単に空白でファイルを命名しないという方針を持っています。 IMO、複数のトークンであるファイル名を持つのは悪いことです(WinやMacでは一般的に見られますが、* nixではそうではありません)。 –
悪いのは、ファイル名について何かを引き受けることです。ファイル名は '/'を含まないC文字列です。期間。あなた自身が 'ls'を解析しているのであれば、間違ったことをしていることになります。つまり、シェルはどのように構文解析するのかを理解していないからです。さらに、あなたはサブシェルを生成して外部コマンドを使用していますが、それは本当に効率的ではありません。代わりにグロブを使用してください:100%安全で、タイプが短く、効率的です(それは意味的に正しいです)。 –
#!/usr/bin/env bash
# cause globs to expand to an empty list if no matches exist
shopt -s nullglob
# Use a glob expression to populate the array
stations=(Kanto-station-names/*)
((${#stations[@]})) || {
echo "ERROR: No stations exist (make sure Kanto-station-names contains files)" >&2
exit 1
}
## read into an array (bash 4.0 or newer)
#readarray -t myarr < <(awk '{print $1}' "${stations[@]}")
# read into an array (bash 3.x-compatible)
IFS=$'\n' read -r -d '' -a myarr < <(awk '{print $1}' "${stations[@]}" && printf '\0') || {
echo "Error extracting first column from station list" >&2
exit 1
}
# print definition of our populated array as output
declare -p myarr
アイテム:
は- Weこのコードには
ls
を使用しないでください。すべての世代のファイル名のリストはグロビングで実行されます。 Why you shouldn't parse the output of ls(1)を参照してください。 "${stations[@]}"
は名前がawk
に渡されるので、awk
を実行している内部プロセス置換を展開している - これは、元のコードのバグの一つでした。- bash 4.0のコメントアウトされた代替の
readarray
コードは、失敗した終了ステータスをawk
から検出しません。 bash 4.4以降では、wait "$!" || { echo "Process failed" >&2; }
などを実行してプロセス置換が失敗したときを検出できます。その前に、プロセス置換の終了ステータスを検出できないため、bash 3.x- bash 4.0〜4.3でも互換性のあるアプローチです。
- 1. sendmail.phpを修正するにはどうしたらいいですか?
- 2. メモリリークを修正するにはどうしたらいいですか?
- 3. "Twilio :: REST :: RestError"を修正するにはどうしたらいいですか?
- 4. Javaバインディングを修正するにはどうしたらいいですか?UnsatisfiedLinkError?
- 5. javascriptで配列をループするにはどうしたらいいですか?
- 6. 配列の文字列を解析して配列にするにはどうしたらいいですか?
- 7. git checkoutで修正されたファイルのみを復元するにはどうしたらいいですか?
- 8. bashでテキストを操作するにはどうしたらいいですか?
- 9. Javaで配列を埋めるにはどうしたらいいですか?
- 10. 非常に長い文字列リテラルをbashで分割するにはどうしたらいいですか?
- 11. mysql接続を修復するにはどうしたらいいですか?
- 12. PHPで文字列から動的配列を作成するにはどうしたらいいですか?
- 13. cocos2dに配列の配列を作成するにはどうしたらいいですか?
- 14. AngularとFirebaseで電子メールログインを修正するにはどうしたらいいですか?
- 15. このハッシュや配列ソートをRailsで修正するにはどうすればよいですか?
- 16. Cでこの2次元配列を修正するにはどうすればよいですか?
- 17. 明らかに破損したCMakeビルドを修正するにはどうすればよいですか?
- 18. Atomikos JTAとHibernateのSpring設定を修正するにはどうしたらいいですか?
- 19. 私の機能を修正するにはどうしたらいいですか?
- 20. Java-GUIプログラム(スイング)を修正するにはどうしたらいいですか?
- 21. 私の読み込みファイルの方法を修正するにはどうしたらいいですか?
- 22. (Actionscript 3)2次元配列のスタックオーバーフローを修正するにはどうすればよいですか?
- 23. phpの単純な配列に連想配列を含めるにはどうしたらいいですか?
- 24. 修正プログラムをLinuxパッケージに入れるにはどうしたらいいですか?
- 25. カスタムアダプタクラスから作成した配列を他のクラスに渡すにはどうしたらいいですか?
- 26. コマンド変数からbashで配列を作成するにはどうすればよいですか?
- 27. JavaでNumberFormatExceptionを修正するにはどうすればいいですか
- 28. Androidでスペルを修正するにはどうすればいいですか?
- 29. iPhone:InputAccessoryViewをViewに修正するにはどうすればいいですか?
- 30. 配列に割り当てられたメモリを解放するにはどうしたらいいですか?
問題を再現するのに十分な情報が質問に含まれていることを確認してください。 –
見てください:http://www.shellcheck.net/ – Cyrus
...一般に、*何も*をシェル配列に読み込むには、適切なツールは 'readarray -t' /' mapfile -t'です、または少なくとも 'read -a'、またはappend操作を実行する' while'ループがあります。 'arr =($(...))'は非常に*非常に*エラーが発生しやすく、避けなければなりません。 –