Используйте lshw
с переключателем --class
или -c
для отображения только системы
class, и вам не нужно беспокоиться об извлечении только первого вхождения:
lshw -c system | grep -E 'product:|serial:'
Если вы не хотите использовать -c system
, вы можете использовать sed
и q
uit при первом появлении serial
:
lshw | sed '/serial/q;/product/!d'
Если вам нужны только значения, вы можете использовать jq
:
lshw -json -c system | jq '.product,.serial'
Предположим, что вы запускаете эти команды от имени пользователя root.
Используя vi while.sh
, создайте новый файл со следующим сценарием:
#!/bin/bash
COUNTER=0
echo "Enter a integer positive number: "
read NUMBER
echo "Numbers from 0 to $NUMBER: "
while [ $NUMBER -ge $COUNTER ]; do
echo $COUNTER
((COUNTER++))
done
Затем используйте chmod + x while.sh
, чтобы дать ему права на выполнение. {{1 }} Вызовите сценарий, используя ./ while.sh
, введите целое число и нажмите Enter (без проверки). Он возвращает:
user@Notebook:/tmp$ ./while.sh
Enter a integer positive number:
5
Numbers from 0 to 5:
0
1
2
3
4
5
Важно, чтобы вы прочитали документацию man
для while, чтения, переменных bash и сравнения для лучшего понимания.
Есть несколько способов сделать это. Это самый простой вариант.
[EDIT] @ user218863, отвечая на ваш комментарий к списку магазинов, вы можете попробовать следующее:
#!/bin/bash -
echo "Enter items separated by a space:"
IFS= read -r LIST
IFS=' ' # split on space only
set -o noglob # disable glob
for item in $LIST; do
printf '%s\n' "$item" || break
done >> shopping_list
echo "List:"
cat shopping_list
Это создаст файл с именем shopping_list с каждым набранным словом, и cat
файл после цикла.
Пожалуйста, если ответы помогли вам, примите тогда :)
Поскольку ваш файл будет называться while.sh
, я полагаю, вы захотите использовать синтаксис sh
.
Вам понадобится:
sh
также имеет встроенную команду read
для чтения ввода в переменную. printf
может сделать это и встроена в большинство интерпретаторов sh
, но поскольку здесь вы хотите вывести несколько вещей, вам может понадобиться команда, которая может сделать это несколько раз в цикле. sh
также имеет эту возможность, встроенную в язык. Так получилось, что команда awk
может делать все вышеперечисленное и имеет конструкцию while()
.
#! /bin/sh -
awk '
BEGIN {printf "Please enter a positive integer number: "}
{while(i <= $0) print i++; exit}'
Здесь вам не нужен sh
, вы можете написать:
#! /usr/bin/awk -f
BEGIN {printf "Please enter a positive integer number: "}
{while(i <= $0) print i++; exit}
bc
- еще одна команда, в которой есть почти все 3. Ей не хватает возможности читать пользовательский ввод, хотя реализация GNU поддерживает это в качестве расширения:
#! /usr/bin/bc -q
"Please enter a prositive integer number: "
n = read()
i = 0
while (i <= n) i++
quit
Вы также можете использовать конструкцию while
оболочки и вызывать несколько команд в цикле, но это обычно считается плохой практикой, менее эффективно и делает код довольно уродливым (также, если вы хотите проверить пользовательский ввод, awk
предоставляет для этого гораздо лучшую функциональность, чем внутренние возможности оболочки (конструкция case
)):
#! /bin/sh -
printf 'Please enter a positive integer number: ' || exit
IFS= read -r number || [ -n "$number" ] || exit
i=0; while [ "$i" -le "$number" ]; do
printf '%s\n' "$i" || exit
i=$((i + 1))
done
Кроме sh
, который выполняет до 3 + 2 × (number + 2) команд ([
, read
и printf
, к счастью, встроенных в большинство интерпретаторов sh
)! Сравните с единственным вызовом одной команды с awk
или bc
выше.
Также обратите внимание, что в некоторых системах есть команда seq
, специально разработанная для вывода последовательностей чисел, по одному в строке (например, seq 0 "$number"
). Создание сценариев оболочки (оболочки - это прежде всего интерпретаторы командной строки) - это прежде всего вызов нужной команды (команд) для выполнения задачи. Это не программирование, поэтому мне кажется странным, что ваш учитель просит вас использовать цикл while
оболочки.