Как преобразовать результат в целое число в bash - PullRequest
0 голосов
/ 31 января 2020

когда я делаю

$ ls | wc -l
703

Это дало мне результат 703, я хочу напечатать 702 (703-1)

Как я могу сделать это в bash?

Ответы [ 3 ]

2 голосов
/ 31 января 2020

(дерзкий ответ) Удалите одну строку из вывода перед подсчетом: D

ls | sed '1d' | wc -l
1 голос
/ 31 января 2020

Вы можете использовать арифметическое c расширение:

result=$(( $(ls | wc - l) - 1))

или просто игнорировать один из файлов

result=$(ls | tail -n+2 | wc -l)

Обратите внимание, что оно не работает, если имена файлов содержат символ перевода строки ; используйте ls -q, чтобы получить одно имя файла на строку в таком случае. Это относится и к первому решению, если вас интересует количество файлов, а не количество строк в их именах.

0 голосов
/ 31 января 2020

Как преобразовать результат как целое в bash

@ choroba уже ответил на этот вопрос, и это должно было решить проблему OP. Тем не менее, я хочу добавить больше к его ответу.

Операторы хотят преобразовать результат в целое число, но Bash не имеет данных типа Integer.

В отличие от многих других языков программирования, Bash не разделяет свои переменные по «типу». По сути, Bash переменные являются символьными строками, но, в зависимости от контекста, Bash разрешает арифметические c операции и сравнения переменных. Определяющим фактором является то, содержит ли значение переменной только цифры.

См. this для арифметической операции c в Bash.

См. this для лучшего примера изучения нетипизированной природы Bash. Я разместил пример ниже:

#!/bin/bash
# int-or-string.sh

a=2334                   # Integer.
let "a += 1"
echo "a = $a "           # a = 2335
echo                     # Integer, still.


b=${a/23/BB}             # Substitute "BB" for "23".
                         # This transforms $b into a string.
echo "b = $b"            # b = BB35
declare -i b             # Declaring it an integer doesn't help.
echo "b = $b"            # b = BB35

let "b += 1"             # BB35 + 1
echo "b = $b"            # b = 1
echo                     # Bash sets the "integer value" of a string to 0.

c=BB34
echo "c = $c"            # c = BB34
d=${c/BB/23}             # Substitute "23" for "BB".
                         # This makes $d an integer.
echo "d = $d"            # d = 2334
let "d += 1"             # 2334 + 1
echo "d = $d"            # d = 2335
echo


# What about null variables?
e=''                     # ... Or e="" ... Or e=
echo "e = $e"            # e =
let "e += 1"             # Arithmetic operations allowed on a null variable?
echo "e = $e"            # e = 1
echo                     # Null variable transformed into an integer.

# What about undeclared variables?
echo "f = $f"            # f =
let "f += 1"             # Arithmetic operations allowed?
echo "f = $f"            # f = 1
echo                     # Undeclared variable transformed into an integer.
#
# However ...
let "f /= $undecl_var"   # Divide by zero?
#   let: f /= : syntax error: operand expected (error token is " ")
# Syntax error! Variable $undecl_var is not set to zero here!
#
# But still ...
let "f /= 0"
#   let: f /= 0: division by 0 (error token is "0")
# Expected behavior.


#  Bash (usually) sets the "integer value" of null to zero
#+ when performing an arithmetic operation.
#  But, don't try this at home, folks!
#  It's undocumented and probably non-portable behavior.


# Conclusion: Variables in Bash are untyped,
#+ with all attendant consequences.

exit $?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...