Из команды я получаю несколько аргументов, которые я хочу предложить пользователю с помощью оператора select из bash в сценарии оболочки. Аргументы, предоставленные командой, могут содержать пробелы и поэтому защищены кавычками. Вот упрощенный пример.

Это работает как ожидалось:

select opt in a b "c d"
do
  echo $opt
  break
done

Результат, как и ожидалось:

1) a
2) b
3) c d
#? 

Но с выводом команды в переменной она не работает должным образом:

opts="a b \"c d\""
select opt in $opts
do
  echo $opt
  break
done

Несмотря на то, что $ opts содержит то же самое, что и жестко заданный тип ввода в первом примере выбора, результат будет другим:

1) a
2) b
3) "c
4) d"
#?

Так что дело не в том, что bash поглотил цитаты. Они сохраняются, но в кавычках не содержится аргумента, как это было, когда я жестко их кодировал. Как я уже писал, я получаю аргументы в качестве вывода из команды. Они могут содержать пробелы и поэтому уже защищены кавычками. Как я могу получить их одним куском к утверждению «выбор»? Речь идет не о одинарных и двойных кавычках. С одинарными кавычками происходит то же самое:

1) a
2) b
3) 'c
4) d'
#?

2 ответа2

0

Используйте массив:

opts=("a" "b" "c d");select opt in "${opts[@]}"; do echo $opt; break; done
0

Это решение должно помочь вам:

#!/bin/bash

opts=(a b "c d");

select opt in "${opts[@]}"
   do echo $opt; 
   break; 
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .