Необходимо извлечь часть числа и сохранить ее в переменной в сценариях оболочки

#shell #unix #ksh #cut

#оболочка #unix #ksh #вырезать

Вопрос:

Не могли бы вы, пожалуйста, помочь мне с моим запросом. Я запускаю script .ksh с 2 аргументами .. одним из которых является число, подобное 14103, и я хочу извлечь 1410 из этого числа и сохранить его в переменной.

Например, противник:

 abc.ksh ST 14103
  

То, что я делаю, это:

 #!/bin/ksh
ENV_TYPE=$1

VER=$2

VER_N=`cut -c1-4 "$VER"`
  

Но у меня это не работает. Что я упускаю?

Ответ №1:

Если вы имеете в виду, что вам нужны первые 4 символа, вы делаете это полностью внутри bash (который, по моему мнению, намного лучше использовать в оболочке):

 VER_N=${VER:0:4}

echo $VER_N
1410
  

Если вы имеете в виду, что хотите использовать все, кроме последнего символа (опять же в bash):

 n=${#VER}          # Get length of VER
((n--))            # Decrement
VER_N=${VER:0:$n}  # Extract all but last

echo $VER_N
1410
  

Или все, кроме последнего символа, но с использованием sed :

 VER_N=$(sed 's/.$//' <<< $VER)
  

Ответ №2:

Команда cut не использует текст своего аргумента командной строки в качестве текста для cut .

Когда задается аргумент командной строки, он пытается интерпретировать его как имя файла и прочитать этот файл.

Если аргумент не указан, он считывается из stdin . В вашем случае проще всего передать входные данные в cut ‘s stdin , а не создавать временный файл, а затем запрашивать cut его чтение.

 #!/bin/ksh
ENV_TYPE=$1

VER=$2

VER_N=`echo $VER | cut -c1-4 `

echo $VER_N
  

Вывод:

 1410
  

Комментарии:

1. Вы также можете использовать VER_N=$(cut -c-4 <<< "$VER") . Обратите внимание, что 1 в -c1-4 является излишним.