bashだけを使用して単一の文字列を文字配列に分割します。

bashだけを使用して単一の文字列を文字配列に分割します。

bashだけを使って配列'hello'に分割したいですh e l l o。 sedで行うことができますが、sed 's/./& /g'区切り文字が何であるか、区切り文字が何であるかわからない場合は、Bashで文字列を配列に分割する方法を知りたいです。単一文字。${i// /}区切り文字が不明で、その式が正規表現を受け入れないため、創造性がなければ使用できないようです。 [[ string =~ ([az].).* ]] で BASH_REMATCH を試してみましたが、期待どおりに動作しませんでした。 bashだけを使用してstring.split()特定のアクションを実行する正しい方法は何ですか?その理由は、すべてのbashでrevユーティリティを作成しようとするためです。

  while read data; do
  word=($(echo $data|tr ' ' '_'|sed 's/./& /g'))
  new=()
  i=$((${#word[@]} - 1))
  while [[ $i -ge 0 ]]; do
    new+=(${word[$i]})
    (( i-- ))
  done
  echo ${new[@]}|tr -d ' '|tr '_' ' '
  done

しかし、私はtrとsedを使用しており、分割を正しく実行する方法を知りたいです。その後、すべてのbashで修正します。楽しみに。

答え1

s="hello"
declare -a a   # define array a
for ((i=0; i<${#s}; i++)); do a[$i]="${s:$i:1}"; done
declare -p a   # print array a in a reusable form

出力:

文-aa='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'

または(コメントを参照してください)

s="hello"
while read -n 1 c; do a+=($c); done  <<< "$s"
declare -p a

出力:

文-aa='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'

答え2

ヌル区切り文字を使用して文字列を文字配列に分割するには、次のようにします。

str='hello'
arr=()
i=0
while [ "$i" -lt "${#str}" ]; do
  arr+=("${str:$i:1}")
  i=$((i+1))
done

printf '%s\n' "${arr[@]}"

空でない区切り文字を使用すると、次のことができます。

set -f
str='1,2,3,4,5'
IFS=',' arr=($str)
printf '%s\n' "${arr[@]}"

答え3

楽しみのための(そして別のシェル) 別の変形:

word=hello
unset letter
while [ ${#word} -gt 0 ]
do
    rest=${word#?}
    letter[${#letter[*]}]=${word%$rest}
    word=$rest
done

そして確認

for l in "${!letter[@]}"
do
    echo "letter [$l] = ${letter[l]}"
done

印刷する

letter [0] = h
letter [1] = e
letter [2] = l
letter [3] = l
letter [4] = o

答え4

答えは次のとおりです。https://stackoverflow.com/a/34634535/2332068

  [[ "${text}" =~ ${text//?/(.)} ]] && array=("${BASH_REMATCH[@]:1}")

Bash 4.3では、${data@Q}の代替を使用しています。

shell-escape-to() {
  local REPLY="${*:2}"
  [[ "${*:2}" =~ ${REPLY//?/(.)} ]] && printf -v "$1" "\\%c" "${BASH_REMATCH[@]:1}"
}
...
shell-escape-to dir_ "$dir"
sg "$GROUP" "exec mkdir -m 775 -p ${dir_}"

bash 4.4以降:sg "$GROUP" "exec mkdir -m 775 -p ${dir@Q}"

関連情報