«Отказано в доступе» при манипулировании строкой переменной bash с расширением подстроки - PullRequest
0 голосов
/ 10 июня 2019

Новичок здесь.Я принял пользовательский ввод как переменную, и я пытаюсь сохранить определенные символы как отдельные переменные.Это дает мне «разрешение отказано».Любое предложение о том, как это исправить?

#!/bin/sh
echo 'Please enter specific release (EX: 20L2): '
read var
echo $var
xx=$(var:0:1) #should grab the first two digits
xx-=1
yy=$(var:2:1) #should grab the last digit
echo "You have chosen var $var, with X value $xx and Y value $yy"

После запуска:

chmod 777 Cleanup1.sh
./Cleanup1.sh

Я получаю:

./Cleanup1.sh[13]: rel:0:2: permission denied
./Cleanup1.sh[14]: xx-=1: permission denied
./Cleanup1.sh[15]: rel:2:1: permission denied

Я использую оболочку OSS / Unixчерез внешний вид.Любая помощь приветствуется!

1 Ответ

2 голосов
/ 10 июня 2019

Несколько вещей:

  • Вы имели в виду ${var:0:1}, а не $(var:0:1). Последний пытается выполнить команду var:0:1, которая не существует и приводит к сообщению об ошибке.
  • Второе число - это не индекс последнего элемента, а длина извлеченной строки, поэтому для получения первых двух цифр вам необходимо ${var:0:2}.
  • Чтобы получить последнюю цифру, вы можете использовать ${var: -1} - обратите внимание на пробел между : и - (требуется Bash 4.3, я думаю 1 ).
  • Расширение параметров с помощью подстрок - это Bashism, поэтому /bin/sh может не справиться с этим - вместо этого используйте #!/bin/bash или #!/usr/bin/env bash в качестве линии шебанга.
  • xx-=1 пытается выполнить команду xx-=1; если вы хотите уменьшить xx на единицу, используйте ((--xx)) или xx=$((xx-1)).

1 Если у вас нет Bash 4.3 или новее, вы можете использовать это вместо:

${var:${#var}-1}
...