Арифметика в сценарии оболочки (арифметика в строке) - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь написать простой скрипт, который создает пять текстовых файлов, перечисляемых переменной в цикле. Кто-нибудь может сказать мне, как сделать, чтобы арифметическое выражение было оценено. Кажется, это не работает:

touch ~/test$(($i+1)).txt

(я знаю, что мог бы оценить выражение в отдельном утверждении или изменении цикла ...)

Заранее спасибо!

1 Ответ

0 голосов
/ 17 октября 2019

Правильный ответ будет зависеть от используемой вами оболочки. Это немного похоже на bash, но я не хочу делать слишком много предположений.

Команда, которую вы перечисляете touch ~/test$(($i+1)).txt, будет корректно касаться файла с тем, чем является $i+1, но что он не делает,меняет значение $i.

Мне кажется, что вы хотите сделать следующее:

  • Найти наибольшее значение n среди файлов с именем testn.txt, гдеn - это число больше 0
  • Увеличьте число как m.
  • коснитесь (или иным образом выведите) нового файла с именем testm.txt, где m - увеличенное число.

Используя перечисленные приемы здесь , вы можете обрезать части имени файла, чтобы получить желаемое значение.

Предположим, что в файле с именем "touchup.sh" содержится следующее:

#!/bin/bash
# first param is the basename of the file (e.g. "~/test")
# second param is the extension of the file (e.g. ".txt")
# assume the files are named so that we can locate via $1*$2 (test*.txt)

largest=0
for candidate in (ls $1*$2); do
   intermed=${candidate#$1*}
   final=${intermed%%$2}
   # don't want to assume that the files are in any specific order by ls
   if [[ $final -gt $largest ]]; then
      largest=$final
   fi
done

# Now, increment and output.
largest=$(($largest+1))
touch $1$largest$2
...