Принятие xz
соблюдает стандартный набор флагов командной строки - включая флаги уровня сжатия, Вы могли попробовать:
tar -cf - foo/ | xz -9 -c - > foo.tar.xz
Причиной этого является порядок, в котором вещи происходят в ударе. Расширение фигурной скобки происходит, прежде чем переменные расширены. Для выполнения цели необходимо использовать C-стиль для цикла:
upperlim=10
for ((i=0; i<=upperlim; i++)); do
echo "$i"
done
Для завершения этого в стиле, использующем только созданный-ins, необходимо было бы использовать оценку:
d=12
for i in `eval echo {0..$d}`
do
echo $i
done
Но с seq
:
lowerlimit=0
upperlimit=12
for i in $(seq $lowerlimit $upperlimit)
do
echo $i
done
Лично я нахожу использование seq
быть более читаемым.
seq
", подтверждение, что это не встроенное.
– Jodie C
10.11.2012, 22:43
read
встроенное, например, но нет никакой причины для eval
это.
– jordanm
10.11.2012, 22:43
Ваш подход не будет работать, поскольку в bash фигурная скобка происходит до раскрытия параметра. Перед этим вам нужно расширить переменную.
Вы можете обойтись с помощью eval :
upperlim=10
eval '
for i in {0..'"$upperlim"'}
do
echo $i
done
'
С помощью цикла while :
upperlim=10
#with while
start=0
while [[ $start -le $upperlim ]]
do
echo "$start"
((start = start + 1))
done
Также вы можете сделать это с помощью команды seq :
upperlim=10
#seq
for i in $(seq "$upperlim"); do
echo "$i"
done
Если вы хотите работать с для i в {0 .. $ upperlim}
, вам нужно будет использовать kornshell. например:
#!/bin/ksh
upperlim=10
for i in {0..$upperlim}
do
echo $i
done
Способ POSIX
Если вам важна переносимость, используйте пример из стандарта POSIX :
i=2
END=5
while [ $i -le $END ]; do
echo $i
i=$(($i+1))
done
Вывод:
2
3
4
5
Вещи, которые не POSIX:
(())
без доллара, хотя это обычное расширение , как упоминается самим POSIX . [[
. [
здесь достаточно. См. Также: https://stackoverflow.com/questions/13542832/bash-if-difference-between-square-brackets-and-double-square-brackets для ((;;))
seq
{start..end}
, и это не может работать с переменными, как указано в руководстве Bash . let i = i + 1
: POSIX 7 2. Командный язык оболочки не содержит слова let
, и он не работает на bash --posix
4.3.42 доллар по i = $ i + 1
может потребоваться, но я не уверен. POSIX 7 2.6.4 Арифметическое расширение говорит:
Если переменная оболочки x содержит значение, которое образует допустимую целочисленную константу, необязательно включая начальный знак плюс или минус, тогда арифметические расширения
«$ ((x))»
и«$ (($ x))»
должны возвращать одно и то же значение.
, но если читать буквально, это не означает, что $ ((x + 1))
расширяется, поскольку x + 1
не является переменной.
zsh
также (но не дляcsh
,tcsh
). – math 04.01.2013, 19:48