在Posix Sh中的字符串中迭代字符


#!/bin/sh
read -p "Enter sequence:  " seq
for char in $seq; do
    echo "$char"
done

我从标准输入中读取"字符"序列。例如,让它为1234(),

我想将其更改为这样:

'1' '2' '3' '4' '(' ')' ','

我不想回声此序列。我需要它具有这个新价值。

在标准SH脚本中是否可以?

这与所有可打印的ascii字符(可能与任何不是nul字节的东西)一起使用,没有外部程序的帮助(printf通常是内置的):

string="$(printf "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%%&'()*+,-./:;<=>?@[\]^_`{|}~ tnr")"
while [ -n "${string}" ]; do
    character="$(printf '%c.' "${string}")"
    character="${character%.}"
    echo "Character: '${character}'"
    string="${string#?}"
done

请注意格式字符串中的额外的非空格字符。我们需要它,以便命令替换不会剥离可能的LF

Character: '0'
Character: '1'
Character: '2'
Character: '3'
Character: '4'
Character: '5'
Character: '6'
Character: '7'
Character: '8'
Character: '9'
Character: 'a'
Character: 'b'
Character: 'c'
Character: 'd'
Character: 'e'
Character: 'f'
Character: 'g'
Character: 'h'
Character: 'i'
Character: 'j'
Character: 'k'
Character: 'l'
Character: 'm'
Character: 'n'
Character: 'o'
Character: 'p'
Character: 'q'
Character: 'r'
Character: 's'
Character: 't'
Character: 'u'
Character: 'v'
Character: 'w'
Character: 'x'
Character: 'y'
Character: 'z'
Character: 'A'
Character: 'B'
Character: 'C'
Character: 'D'
Character: 'E'
Character: 'F'
Character: 'G'
Character: 'H'
Character: 'I'
Character: 'J'
Character: 'K'
Character: 'L'
Character: 'M'
Character: 'N'
Character: 'O'
Character: 'P'
Character: 'Q'
Character: 'R'
Character: 'S'
Character: 'T'
Character: 'U'
Character: 'V'
Character: 'W'
Character: 'X'
Character: 'Y'
Character: 'Z'
Character: '!'
Character: '"'
Character: '#'
Character: '$'
Character: '%'
Character: '&'
Character: '''
Character: '('
Character: ')'
Character: '*'
Character: '+'
Character: ','
Character: '-'
Character: '.'
Character: '/'
Character: ':'
Character: ';'
Character: '<'
Character: '='
Character: '>'
Character: '?'
Character: '@'
Character: '['
Character: ''
Character: ']'
Character: '^'
Character: '_'
Character: '`'
Character: '{'
Character: '|'
Character: '}'
Character: '~'
Character: ' '
Character: '    '
Character: '
'
'haracter: '

对于长字符串,sed可能会更快。

您可以用sed(1)将字符串分开:

seq=`printf "%sn" "$seq" | sed 's/./ &/g'`

最新更新