Цикл целых чисел

Используйте lshw с переключателем --class или -c для отображения только системы class, и вам не нужно беспокоиться об извлечении только первого вхождения:

lshw -c system | grep -E 'product:|serial:'

Если вы не хотите использовать -c system, вы можете использовать sed и quit при первом появлении serial:

lshw | sed '/serial/q;/product/!d'

Если вам нужны только значения, вы можете использовать jq:

lshw -json -c system | jq '.product,.serial'

Предположим, что вы запускаете эти команды от имени пользователя root.

0
02.03.2017, 22:46
2 ответа

Используя 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 файл после цикла. Пожалуйста, если ответы помогли вам, примите тогда :)

2
28.01.2020, 02:16

Поскольку ваш файл будет называться 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 оболочки.

3
28.01.2020, 02:16

Теги

Похожие вопросы