для цикла, не работающего на несколько строк

[

]Вы можете попробовать команду sux:[

] [
sux user2
] [

]sux обработает $DISPLAY для вас. Вам может понадобиться установить его с:[

] [
sudo apt-get install sux
] [

]в Debian/Ubuntu.[

].
1
29.11.2014, 22:49
2 ответа

Проблема в вашем массиве. Похоже, вы создали массив только с одним элементом. Попробуйте этот пример:

array=("$(printf 'Apple\nBanana\nClementine\nDate')")

for ((i = 0; i < ${#array[@]}; i++)); do
  printf '%d. %s\n' $((i+1)) "${array[$i]}"
done

j=0
for e in "${array[@]}"; do
  j=$((j+1))
  printf '%d. %s\n' "$j" "$e"
done

k=0
for e in ${array[@]}; do
  k=$((k+1))
  printf '%d. %s\n' "$k" "$e"
done

Затем запустите:

$ ./test.sh 
1. Apple
Banana
Clementine
Date
1. Apple
Banana
Clementine
Date
1. Apple
2. Banana
3. Clementine
4. Date

Вы можете увидеть, вы на самом деле создаете массив, содержит один элемент. 3-й цикл печатает четыре элемента, потому что оболочка выполнила полевое расщепление на строке Apple \ Nbanana \ NClementine \ Ndate , которая дала вам четыре разделенные слова.

Если вы измените массив на:

set -f
array=( $(printf 'Apple\nBanana\nClementine\nDate') )
set +f

( SET -F отключает расширение подстановки, в случае, если символы *? \ [ появляются в выходе команды) Получите желаемый результат, который является то, что вывод команды разделен на пробел:

$ ./test.sh 
1. Apple
2. Banana
3. Clementine
4. Date
1. Apple
2. Banana
3. Clementine
4. Date
1. Apple
2. Banana
3. Clementine
4. Date

Обратите внимание, что вы должны использовать двойные кавычки «$ {Array [@]}» , когда вы хотите повторить Через всех элементов массива или используйте C-стиль для петли, как мой первый пример.

2
27.01.2020, 23:37

Это то, что вам нужно:

[sreeraj@server ~]$ fruits=(Apple Banana Clementine Date)
[sreeraj@server ~]$ (IFS=$'\n'; echo "${fruits[*]}") | nl
     1  Apple
     2  Banana
     3  Clementine
     4  Date
[sreeraj@server ~]$
0
27.01.2020, 23:37

Теги

Похожие вопросы