Автор Гілка: Програмування Shell Bash.  (Прочитано 6475 раз)

Руслан

  • Гість
Доброго дня, потрібна Ваша допомога. Звернувся по допомогу на linux.org.ru та там такий негатив тяне до Українців, що не хочеться лишній раз чіпляти за живе...

Є такий код:

Код: Bash
  1.  
  2. function usage {
  3.   echo -e  "usage: $0 filename ...\nERROR:"
  4. }
  5.  
  6. if [ $# -gt 0 ]
  7. then
  8.   name=Your\ Name
  9.   echo -e "$name\n`date`\n"
  10.     while [ $# -gt 0 ]
  11.     do
  12.       if [ -f "$1" ]
  13.       then
  14.         echo -e "\n$1"
  15.         starting_data=$1
  16.         sed '/id, /d' $starting_data > noHeader
  17.         cut -f1 -d, noHeader > file_ID
  18.         sed 's/,\ /\ /' noHeader > noComma
  19.         sed 's/,\ /\ /' noComma > noCommas
  20.         cut -f2 -d\  noCommas > file_LN
  21.         cut -f3 -d\  noCommas > file_FN
  22.         sed 's/$/:/' file_LN > file_LN_col
  23.         paste -d\  file_FN file_LN_col file_ID > pre_final
  24.         sed 's/-//g' pre_final > final
  25.         more final
  26.         rm noHeader file_ID noComma noCommas file_LN file_FN file_LN_col pre_final final
  27.       else
  28.         echo -e "`usage` Could not find file $1"
  29.       fi
  30.       shift
  31.     done
  32. else
  33.   echo -e "`usage` You did not enter one or more filenames"
  34. fi
  35.  

потрібно два нижні echo перенести в функцію usage , і замість них викликати цю функцію
Дякую
« Змінено: 2016-04-16 18:07:37 від lvm »

Koljan

  • Гість
Re: Програмування Shell Bash.
« Відповідей #1 : 2016-04-16 13:33:38 »
та там такий негатив тяне до Українців.

Зомбі... ось що значить зомбоящик

Відсутній ukrkyi

  • Дописувач
  • **
  • дописів: 99
  • Карма: +0/-0
Re: Програмування Shell Bash.
« Відповідей #2 : 2016-04-16 18:01:34 »
Отак норм?
Код: Bash
  1. function usage {
  2.   echo -e  "usage: $0 filename ...\nERROR: $1"
  3. }
  4.  
  5. if [ $# -gt 0 ]
  6. then
  7.   name=Your\ Name
  8.   echo -e "$name\n`date`\n"
  9.     while [ $# -gt 0 ]
  10.     do
  11.       if [ -f "$1" ]
  12.       then
  13.         echo -e "\n$1"
  14.         starting_data=$1
  15.         sed '/id, /d' $starting_data > noHeader
  16.         cut -f1 -d, noHeader > file_ID
  17.         sed 's/,\ /\ /' noHeader > noComma
  18.         sed 's/,\ /\ /' noComma > noCommas
  19.         cut -f2 -d\  noCommas > file_LN
  20.         cut -f3 -d\  noCommas > file_FN
  21.         sed 's/$/:/' file_LN > file_LN_col
  22.         paste -d\  file_FN file_LN_col file_ID > pre_final
  23.         sed 's/-//g' pre_final > final
  24.         more final
  25.         rm noHeader file_ID noComma noCommas file_LN file_FN file_LN_col pre_final final
  26.       else
  27.         usage "Could not find file $1"
  28.       fi
  29.       shift
  30.     done
  31. else
  32.   usage "You did not enter one or more filenames"
  33. fi
  34.  
« Змінено: 2016-04-16 18:06:58 від lvm »
openSUSE TUMBLEWEED | Arch Linux | HP ProBook 4540s | Шукаю драйвер rtbth… Відлетів після оновлення ядра і не повернувся…

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Програмування Shell Bash.
« Відповідей #3 : 2016-04-16 18:05:30 »
Робиш лабу і не хочеш вчитися? :-)

Код: Bash
  1. #!/bin/bash
  2. set -ueo pipefail # Strict mode
  3.  
  4. usage() {
  5.   echo "Usage: $0 FILE...
  6.  where FILE is path to file with data to process.
  7.  TODO: describe format of expected data.
  8. "
  9. }
  10.  
  11. error() {
  12.   echo "ERROR: $*" >&2
  13. }
  14.  
  15. process_file() {
  16.   local FILE="${1:?ERROR:Argument is required: file to process.}"
  17.   local WORK_DIR="$(mktemp -d)"
  18.  
  19.   # TODO: use AWK, or perl, or pipes at least, to awoid temporary files
  20.   sed '/id, /d' "$FILE" > "$WORK_DIR"/noHeader
  21.   cut -f1 -d',' "$WORK_DIR"/noHeader > "$WORK_DIR"/file_ID
  22.   sed 's/,\ /\ /' "$WORK_DIR"/noHeader > "$WORK_DIR"/noComma
  23.   sed 's/,\ /\ /' "$WORK_DIR"/noComma > "$WORK_DIR"/noCommas
  24.   cut -f2 -d' ' "$WORK_DIR"/noCommas > "$WORK_DIR"/file_LN
  25.   cut -f3 -d' ' "$WORK_DIR"/noCommas > "$WORK_DIR"/file_FN
  26.   sed 's/$/:/' "$WORK_DIR"/file_LN > "$WORK_DIR"/file_LN_col
  27.   paste -d' ' "$WORK_DIR"/file_FN "$WORK_DIR"/file_LN_col "$WORK_DIR"/file_ID > "$WORK_DIR"/pre_final
  28.   sed 's/-//g' "$WORK_DIR"/pre_final > "$WORK_DIR"/final
  29.  
  30.   more "$WORK_DIR"/final
  31.  
  32.   rm -rf "$WORK_DIR"
  33.   return 0
  34. }
  35.  
  36. main() {
  37.  
  38.   local NAME="Your Name"
  39.   echo "$NAME"
  40.   date
  41.  
  42.   local FILE
  43.   for FILE in "$@"
  44.   do
  45.     [ -e "$FILE" ] || {
  46.       error "File \"$FILE\" is not exists."
  47.       continue
  48.     }
  49.     [ -f "$FILE" ] || {
  50.       error "Argument \"$FILE\" is not a file."
  51.       continue
  52.     }
  53.  
  54.     printf "\n%s\n" "$FILE"
  55.     process_file "$FILE" || {
  56.       error "Cannot process file \"$FILE\"."
  57.       continue
  58.     }
  59.   done
  60. }
  61.  
  62. # Check arguments
  63. (( $# > 0 )) || {
  64.   usage
  65.   exit 1
  66. }
  67.  
  68. main "$@"
  69.  
[Fedora Linux]

Відсутній Ruslan

  • Новачок
  • *
  • дописів: 0
  • Карма: +0/-0
  • I Love YaBB 2!
Re: Програмування Shell Bash.
« Відповідей #4 : 2016-04-16 22:02:29 »
Роблю лабу =)

Хочу вчитися та застряв просто =)

Мені потрібно лише перенести два нижні echo  в функцію та викликати її , цу така домашка,  інакше це вже не я робив і буде не те що треба =(

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Програмування Shell Bash.
« Відповідей #5 : 2016-04-16 22:11:37 »
Роблю лабу =)

Хочу вчитися та застряв просто =)

Мені потрібно лише перенести два нижні echo  в функцію та викликати її , цу така домашка,  інакше це вже не я робив і буде не те що треба =(

Ну і чому не можна просто перенести текст з одного місця в інше, запустити і подивитися чи вийшло чи ні?
[Fedora Linux]

Відсутній Ruson

  • Новачок
  • *
  • дописів: 31
  • Карма: +0/-0
  • Вивчаю Linux
Re: Програмування Shell Bash.
« Відповідей #6 : 2016-04-16 22:57:47 »
Отак норм?

Ні тому що
       usage "Could not find file $1"
      fi
      shift
    done
else
  usage "You did not enter one or more filenames"
     
Повинно бути в функції. А на цьому місті потрібно викликати цю функцію

Відсутній ukrkyi

  • Дописувач
  • **
  • дописів: 99
  • Карма: +0/-0
Re: Програмування Shell Bash.
« Відповідей #7 : 2016-04-16 23:33:30 »
Повинно бути в функції. А на цьому місті потрібно викликати цю функцію
емм?
рядки
usage "Could not find file $1"
usage "You did not enter one or more filenames"
викликають функцію "usage" з рядковим параметром, який і виводиться.
Що не так?
openSUSE TUMBLEWEED | Arch Linux | HP ProBook 4540s | Шукаю драйвер rtbth… Відлетів після оновлення ядра і не повернувся…

Відсутній Ruson

  • Новачок
  • *
  • дописів: 31
  • Карма: +0/-0
  • Вивчаю Linux
Re: Програмування Shell Bash.
« Відповідей #8 : 2016-04-16 23:39:10 »
Ось мій код як він приблизно має виглядати. Але він не працює =(

Код: Bash
  1.  
  2. function usage {
  3.   echo -e  "usage: $0 filename ...\nERROR:"
  4.   if [ -f "$1" ]
  5.   then
  6.     echo "Could not find file $1"
  7.   else
  8.       echo "You did not enter one or more filenames"
  9.   fi
  10.  
  11. }
  12.  
  13. if [ $# -gt 0 ]
  14. then
  15.   name=Your\ Name
  16.   echo -e "$name\n`date`\n"
  17.     while [ $# -gt 0 ]
  18.     do
  19.       if [ -f "$1" ]
  20.       then
  21.         echo -e "\n$1"
  22.         starting_data=$1
  23.         sed '/id, /d' $starting_data > noHeader
  24.         cut -f1 -d, noHeader > file_ID
  25.         sed 's/,\ /\ /' noHeader > noComma
  26.         sed 's/,\ /\ /' noComma > noCommas
  27.         cut -f2 -d\  noCommas > file_LN
  28.         cut -f3 -d\  noCommas > file_FN
  29.         sed 's/$/:/' file_LN > file_LN_col
  30.         paste -d\  file_FN file_LN_col file_ID > pre_final
  31.         sed 's/-//g' pre_final > final
  32.         more final
  33.         rm noHeader file_ID noComma noCommas file_LN file_FN file_LN_col pre_final final
  34.       else
  35.         usage
  36.         #echo -e "`usage` Could not find file $1"
  37.       fi
  38.       shift
  39.     done
  40. else
  41.   usage
  42.   #echo -e "`usage` You did not enter one or more filenames"
  43. fi
  44.  
  45.  
  46.  


Хоча, він майже працює. Він не видає вірне повідомлення якщо я вказую не існуючий файл наприклад
Коли я прописую  ./myScript  qwertyя отримую повідомлення:
You did not enter one or more filenamesА потрібно
Could not find file qwerty
« Змінено: 2016-04-16 23:53:45 від lvm »

Відсутній Ruson

  • Новачок
  • *
  • дописів: 31
  • Карма: +0/-0
  • Вивчаю Linux
Re: Програмування Shell Bash.
« Відповідей #9 : 2016-04-16 23:50:24 »
емм?
рядки
usage "Could not find file $1"
usage "You did not enter one or more filenames"
викликають функцію "usage" з рядковим параметром, який і виводиться.
Що не так?

В тому то і справа що все так =)
Але задача в тому щоб ці повідомлення засунути в функцію.
На одне повідомлення вище я відправив мій код в тому вигляді як він має бути вже з функцією але є десь помилка...

Відсутній ukrkyi

  • Дописувач
  • **
  • дописів: 99
  • Карма: +0/-0
Re: Програмування Shell Bash.
« Відповідей #10 : 2016-04-17 00:15:06 »
Питання в тому, що $1 всередині функції приймає значення першого параметра функції, а не скрипта
Тож тобі все одно якимось чином треба передати переданий параметр :-/
Можна викликати функцію так:
usage $1А можна перед тим встановлювати якусь змінну, яку дивитись у функції.
Напевно ще існують інші шляхи… :-X
« Змінено: 2016-04-17 00:15:39 від ukrkyi »
openSUSE TUMBLEWEED | Arch Linux | HP ProBook 4540s | Шукаю драйвер rtbth… Відлетів після оновлення ядра і не повернувся…

Відсутній Ruson

  • Новачок
  • *
  • дописів: 31
  • Карма: +0/-0
  • Вивчаю Linux
Re: Програмування Shell Bash.
« Відповідей #11 : 2016-04-17 00:25:31 »
Питання в тому, що $1 всередині функції приймає значення першого параметра функції, а не скрипта
Тож тобі все одно якимось чином треба передати переданий параметр :-/
Можна викликати функцію так:
usage $1А можна перед тим встановлювати якусь змінну, яку дивитись у функції.
Напевно ще існують інші шляхи… :-X

Так, я використав змінну і все працює, але мені здається що такий варіант не пройде, я маю на увазі що це не те чого потребує завдання:
SELECT=0
function usage
{
  if [ $SELECT -eq 1 ]
  then
    echo -e  "usage: $0 filename ...\nERROR: Could not find file $1"
  fi
  #
  if [ $SELECT -eq 2 ]
  then
    echo -e  "usage: $0 filename ...\nERROR: You did not enter one or more filenames"
  fi
}
та виклик
   
      else
      SELECT=1
      usage
      fi
      shift
    done
else
  SELECT=2
  usage
fi

Відсутній ukrkyi

  • Дописувач
  • **
  • дописів: 99
  • Карма: +0/-0
Re: Програмування Shell Bash.
« Відповідей #12 : 2016-04-17 00:28:11 »
Можна ж типу FILENAME=$1, а потім як було :o
openSUSE TUMBLEWEED | Arch Linux | HP ProBook 4540s | Шукаю драйвер rtbth… Відлетів після оновлення ядра і не повернувся…

Відсутній Ruson

  • Новачок
  • *
  • дописів: 31
  • Карма: +0/-0
  • Вивчаю Linux
Re: Програмування Shell Bash.
« Відповідей #13 : 2016-04-17 00:34:57 »
Можна ж типу FILENAME=$1, а потім як було :o

Це як ?  ;D

Я думаю мабуть попробую за допомогою CASE
« Змінено: 2016-04-17 00:37:44 від Ruson »

Відсутній ukrkyi

  • Дописувач
  • **
  • дописів: 99
  • Карма: +0/-0
Re: Програмування Shell Bash.
« Відповідей #14 : 2016-04-17 00:36:50 »
FILENAME=$1
function usage {
  echo -e  "usage: $0 filename ...\nERROR:"
  if [ "$FILENAME" ]
  then
    echo "Could not find file $FILENAME"
  else
      echo "You did not enter one or more filenames"
  fi

}
« Змінено: 2016-04-17 00:38:32 від ukrkyi »
openSUSE TUMBLEWEED | Arch Linux | HP ProBook 4540s | Шукаю драйвер rtbth… Відлетів після оновлення ядра і не повернувся…