LINUX.ORG.RU
ФорумJob

Коммандная строка Линукс - Bash

 


0

2

Нужна помощь по программированию в коммандной строке линукс. Совсем немного но за небезплатно =)

Нужно перенести аргументы в функцию что бы запускать через скрипт

Для деталей пишите на Skype: ruslik_rv или в ICQ: 348179085.

Перемещено beastie из development



Последнее исправление: Ruson77 (всего исправлений: 2)

Вот этот текст при добавлении сообщения видел?

Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки LORCODE

Так вот прочитай его и выполни написанное в нём, а потом используй полученные знания при оформлении своих сообщений и отредактируй шапку темы.

Удачи.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)

Совсем немного но за не бесплатно =)

в job

Deleted
()

ruslik? Ruson? пиши проще - малолетний дегенерат

anonymous
()

Нужно перенести аргументы в функцию что бы запускать через скрипт

Написал бы тут «у меня вот чет не работает, помогите с кодом, вот мой пример <тут хеллуворд из интернетов>» - за пять минут бы написали, попутно троля соседних отписавшихся.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

не понял сразу как его сюда вставить корректно

function usage { echo -e "usage: $0 filename ...\nERROR:" } if [ $# -gt 0 ] then name=Your\ Name echo -e "$name\n`date`\n" while [ $# -gt 0 ] do if [ -f "$1" ] then echo -e "\n$1" else echo -e "`usage` Could not find file $1" fi shift done else echo -e "`usage` You did not enter one or more filenames" fi

Ruson77
() автор топика

Вот так:

function usage { 
  echo -e  "usage: $0 filename ...\nERROR:"
}
 
 
if [ $# -gt 0 ]
then
  name=Your\ Name
  echo -e "$name\n`date`\n"
    while [ $# -gt 0 ]
    do
      if [ -f "$1" ]
      then
        echo -e "\n$1"
      else 
        echo -e "`usage` Could not find file $1"
      fi
      shift
    done
else 
  echo -e "`usage` You did not enter one or more filenames"
fi


kostik87 ★★★★★
()

У меня работает. Если тебе надо текст из файла показать то замени

echo -e "\n$1"

на

echo -e "\n$(cat $1)"

// А, отправил до того как ТС написал о том, что ему нужно от скрипта

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от Ruson77

Тогда функция будет аналогична твоему циклу. У тебя итерации по массиву файлов должна идти в одном цикле (или функции, в которой будет цикл), а проверка существования файла - в другом. Иначе получится то же самое, что есть, только в профиль.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

у меня тоже все работает, но задача перенести два нижних echo и аргументы в функцию usage , а на их месте сделать вызов самой этой функции

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

Нафейхуа? В твоей функции будет один «echo -e $1» смысл вообще этой функции?

kostik87 ★★★★★
()
Ответ на: комментарий от Ruson77

Ну можно сделать что-то вроде

function usage { 
  if [ -n "$1" ] 
    then
      [ -f "$1" ] && echo -e "\n$1" || echo -e " Could not find file $1"
  else 
    echo -e  "usage: $0 filename ...\nERROR:"
  fi
}

if [ $# -gt 0 ]
then
  name=Your\ Name
  echo -e "$name\n`date`\n"
    while [ $# -gt 0 ]
    do
      usage $1
      shift
    done
else 
  usage
fi

Но это фигня, лучше тогда и while в функцию внести, и опять получим то, что было.

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от Ruson77

надо чтото в этом роде

function usage {
  echo -e  "usage: $0 filename ..."
  if [ $# -eq 0 ]
  then echo "ERROR: You did not enter a filename"
  else echo "ERROR: Could not find the file"
  fi
}

usage

#if [ $# -gt 0 ]
#then

  name=Ruslan\ Bezruchuk
  echo -e "$name\n`date`\n"

  while [ $# -gt 0 ]
  do
    if [ -f "$1" ]
    then
      echo -e "\n$1"
    else
        usage
    fi
     shift
   done

Этот не работает, я не спец что бы понять сразу чего не хватает и где, неделю только как пытаюсь изучать Shell

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

Позиционные переменные внутри функции не совпадают с таковыми во всём скрипте и содержат параметры вызова функции. Если ты об этом.

sin_a ★★★★★
()
Ответ на: комментарий от alozovskoy

надо бы еще внести в функцию «You did not enter one or more filenames»

Это на случай пустой строки без аргументов

Ruson77
() автор топика
Ответ на: комментарий от Belen

Вобщем ладно, вот полный скрипт моих ляпов:

function usage {
  echo -e  "usage: $0 filename ...\nERROR:"
}

if [ $# -gt 0 ]
then
  name=Your\ Name
  echo -e "$name\n`date`\n"
    while [ $# -gt 0 ]
    do
      if [ -f "$1" ]
      then
        echo -e "\n$1"
        starting_data=$1
        sed '/id, /d' $starting_data > noHeader
        cut -f1 -d, noHeader > file_ID
        sed 's/,\ /\ /' noHeader > noComma
        sed 's/,\ /\ /' noComma > noCommas
        cut -f2 -d\  noCommas > file_LN
        cut -f3 -d\  noCommas > file_FN
        sed 's/$/:/' file_LN > file_LN_col
        paste -d\  file_FN file_LN_col file_ID > pre_final
        sed 's/-//g' pre_final > final
        more final
        rm noHeader file_ID noComma noCommas file_LN file_FN file_LN_col pre_final final
      else
        echo -e "`usage` Could not find file $1"
      fi
      shift
    done
else
  echo -e "`usage` You did not enter one or more filenames"
fi
как я уже сказал нужно просто перенести два нижних echo в функцию usage а на их месте вызвать эту функцию.

Понимаю что помогать полностью никому просто так не интересно, поэтому и говорю что готов заплатить тому кто проведет до конца. Почему такая цепная негативная реакция пошла с самого начала, чесно говоря не понимаю, но да ладно.

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

перенести два нижних echo в функцию usage

USAGE(){
echo "
HELLO KITTY :)
somthing wrong :(
usage: $1 filename ...\nERROR:
$2
"
}

USAGE "$0" "Could not find file $1"

USAGE "$0" "You did not enter one or more filenames"

(сначала пробел пропустил)

sin_a ★★★★★
()
Последнее исправление: sin_a (всего исправлений: 2)
Ответ на: комментарий от sin_a

Caм скрипт нужно оставить. Все работает в точночти как и должно просто задача заключается в том что бы последних два echo интегрировать в функцию и вызывать через функцию

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

предполагается что в той же директории находятся еще несколько файлов с колонками данных которые будут трансформироваться при вызове скрипта методом

./thisScript dataFile1 dataFile2 dataF15
и так далее.

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

У меня не было задачи исправить до необходимого вида. Хотя бы потому, что я совершенно не понял что это делает. У меня была задача показать на примере как можно использовать функцию.

sin_a ★★★★★
()
Ответ на: комментарий от sin_a

У меня задача именно исправить до необходимого вида. Если есть желание довести до этого самого необходимого вида и чтото не понятно я специально для этого оставил свои контакты что бы не разводить флуда. А примеров тут уже предостаточно.

Тем не менее, спасибо!

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

Коммандная строка Линукс - Bash

Ага. И еще «Язык программирования Линукс — Си» и «Веб-браузер Линукс — Файрфокс».

Линукс (кстати, это слово мужского рода, а не женского) здесь вообще никаким боком.

Для деталей пишите на Skype: ruslik_rv или в ICQ: 348179085.

Шутить изволите?

как я уже сказал нужно просто перенести два нижних echo в функцию usage

а на их месте вызвать эту функцию.

Вам не нужно этого «просто» делать.

"usage: $0 filename ...\nERROR:"

Вообще-то это принпиально неверно, в программу должно быть записано ее каноническое имя, а не то, под каким она сейчас хранится, но хотя бы путь-то отбросьте

if [ $# -gt 0 ]

Вот не надо плодить вложенность по пустякам. Что-то не так - кидаем ошибку и выходим.

name=Your\ Name

Кавычки отнюдь не зло.

echo -e "$name\n`date`\n"

Лютый изврат.

while [ $# -gt 0 ]

Существует цикл for, ага.

echo -e "\n$1"
starting_data=$1
sed '/id, /d' $starting_data > noHeader
cut -f1 -d, noHeader > file_ID
sed 's/,\ /\ /' noHeader > noComma
sed 's/,\ /\ /' noComma > noCommas
cut -f2 -d\ noCommas > file_LN
cut -f3 -d\ noCommas > file_FN
sed 's/$/:/' file_LN > file_LN_col
paste -d\ file_FN file_LN_col file_ID > pre_final
sed 's/-//g' pre_final > final
more final
rm noHeader file_ID noComma noCommas file_LN file_FN file_LN_col pre_final final

Что этот ужас вообще делает? Дайте характеристический пример ввода и требуемый вывод.

echo -e "`usage` You did not enter one or more filenames"
echo -e "`usage` Could not find file $1"

Ошибкам нечего делать на стандартном выводе, есть вывод ошибок.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Нормальная обвязка для цикла по файлам может выглядеть как-то так:

#!/bin/bash

# config
NAME="Your Name"

# подчеркиваю еще раз: это принципиально неверно, когда определитесь с
#  именем, задайте $SCRIPTNAME явно
SCRIPTNAME="${0##*/}"
USAGE=$"Usage: $SCRIPTNAME <file>..."

err() {
    printf >&2 "$SCRIPTNAME: $*\n"
    continue 2>&-
    exit 1
}

(( $# < 1 )) || err "$USAGE"

echo >&2 "$NAME"
date >&2

for file; do
    [[ -f "$file" ]] || err $"‘$file’: No such file or directory"

    # обработка каждого файла
done

А чтобы написать нормально то, что вы попытались сделать при помощи кучи временных файлов, я уже сказал, что я от вас жду.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от Zmicier

Как я уже написал, имеется cледующий файл usage.sh c кодом:

function usage {
  echo -e  "usage: $0 filename ...\nERROR:"
}

if [ $# -gt 0 ]
then
  name= Name\ Lastname  
  echo -e "$name\n`date`\n"
    while [ $# -gt 0 ]
    do
      if [ -f "$1" ]
      then
        echo -e "\n$1"
        starting_data=$1
        sed '/id, /d' $starting_data > noHeader
        cut -f1 -d, noHeader > file_ID
        sed 's/,\ /\ /' noHeader > noComma
        sed 's/,\ /\ /' noComma > noCommas
        cut -f2 -d\  noCommas > file_LN
        cut -f3 -d\  noCommas > file_FN
        sed 's/$/:/' file_LN > file_LN_col
        paste -d\  file_FN file_LN_col file_ID > pre_final
        sed 's/-//g' pre_final > final
        more final
        rm noHeader file_ID noComma noCommas file_LN file_FN file_LN_col pre_final final
      else
        echo -e "`usage` Could not find file $1"
      fi
      shift
    done
else
  echo -e "`usage` You did not enter one or more filenames"
fi

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

Например когда пишем ./usage.sh dataFile1 то колонки данных в будут отображаться по другому, как задано в самом скрипте. И сейчас єто не важно, просто оставьте как есть.

Сейчас, мне нужно єти две строки

echo -e "`usage` Could not find file $1"
  echo -e "`usage` You did not enter one or more filenames"

интегрировать в функцию usage и вместо них выполнить вызов этой функции.

Варинты того что делает этот скрипт. Так должно все и остаться. Если файл не указан

$ ./usage.sh
usage: ./usage.sh filename ...
ERROR: You did not enter one or more filenames
Если указан не существующий файл
$ ./usage.sh qwerty
Your Name
Fri Apr 14 13:21:06 PST 2016

usage: ./usage.sh filename ...
ERROR: Could not find file qwerty
Если указан(ы) существующийе файлы один и более
$ ./usage.sh dataFile1  dataFile2  dataFile3
Your Name
Fri Apr 14 13:21:06 PST 2015
# Тут отображаются уже измененные даные

dataFile1 измененные даные с dataFile1

dataFile2 измененные даные с dataFile2

dataFile3 измененные даные с dataFile3

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

Единственный код который должна содеражть функия это сообщения об ошибке, когда не указали ни одного имени файла, и когда указанный файл просто не существует.

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

то колонки данных в будут отображаться по другому, как задано в самом скрипте. И сейчас єто не важно, просто оставьте как есть.
єто не важно
єто

Что значіт «не важно»? Я вам говорю, что у вас не только цікл по файлам (который я, между прочім, выше уже́ прівел в том віде, в каком сто́іт его ізложіть), но і сама обработка — лютая дічь. И я не намерен по ней разбірать, что у вас там проісходіт, — дайте образец входа и выхода.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Да пожалуйста файл qwerty

id, last, first
123-45-6789, Frank, Joseph 
345-67-8901, Rider, Sandy 
456-78-9012, Saloon, Scott 
678-90-1234, Armstrong, Neil
А это его вывод, который должен остаться неизменным с учетом пробелов

$ usage.sh qwerty

Your name 
Fri Apr 15 18:08:50 PDT 2016

qwerty 
Joseph Frank: 123456789 
Sandy Rider: 345678901 
Scott Saloon: 456789012 
Neil Armstrong: 678901234

ps... А я думал что тут запрещено одно слово лепить с двух раскладок, как на большинстве форумов, ну тiперь будім знать. Откуда злости столько ?

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

Да пожалуйста файл qwerty
А это его вывод, который должен остаться неизменным с учетом пробелов

Вот с этого и надо было начинать. Только что значит «с учетом пробелов»? В смысле имена и фамилии могут содержать пробелы? ОК.

Проверяйте:

#!/bin/bash

# config
NAME="Your Name"

SCRIPTNAME="${0##*/}"
USAGE=$"Usage: $SCRIPTNAME <file>..."

err() {
    printf >&2 "$SCRIPTNAME: $*\n"
    continue 2>&-
    exit 1
}

(( $# >= 1 )) || err "$USAGE"

echo "$NAME"
date

for file; do
    [[ -f "$file" ]] || err $"‘$file’: No such file or directory"

    echo
    echo "$file"
    {
        read
        while IFS=',' read id last first; do
            # sic! кавычки не нужны
            echo $first ${last}: ${id//-/}
        done
    } < "$file"
done

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Профессионально, спору нет, но это не совсем то что мне нужно. Вы полностью убрали сообщения об ошибках, мне нужно что бы они отображались точно в таком виде как они есть в моем скрипте. А также нужно сохранить саму структуру скрипта и вызов функции. Можно ли не изменять мой скрипт за исключением тех строк без изменения которых скрипт работать не будет?

Спасибо!

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

Оба сообщения об ошибке независимо от исхода начинаются с:

usage: ./test222 filename ...
ERROR:

Потом, в функции usage в зависимости от условия к ERROR: нужно присоединить следующее:

Если строка при вызове скрипта пустая

You did not enter one or more filenames

Если имя файла было указано не верно

Could not find file $1"

Повторюсь, мой скрипт уже все это делает, задача заключается именно в том что бы интегрировать эти два сообщения об ошибке в функцию.

Ruson77
() автор топика
Ответ на: комментарий от alozovskoy

Ну можно сделать что-то вроде

function usage { 
  if [ -n "$1" ] 
    then
      [ -f "$1" ] && echo -e "\n$1" || echo -e " Could not find file $1"
  else 
    echo -e  "usage: $0 filename ...\nERROR:"
  fi
}

Использовал Вашу функцию, заточил под поставленные мне задачи, сейчас все работает как нужно.

function usage {
  echo -e "usage: $0 filename ...\nERROR:"
  if [ -n "$1" ]
    then
      [ -f "$1" ] && echo -e "\n$1" || echo -e "Could not find file $1"
  else
    echo "You did not enter one or more filenames"
  fi
}
Единственное надо как то присоединить сообщения, что бы выводились в одной строке с «ERROR: » , но это уже мелочи, Спасибо за помощь!

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

Так у вас перед выводом ERROR стоит символ перевода каретки (\n), если его убрать ERROR будет на той же строке.

Или нужно чтоб не было перевода строки после ERROR? Тогда можно добавить ключ -n для echo:

$ echo -n "ERROR: "; echo "Something wrong"
ERROR: Something wrong
$
alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Да, так точно, нагуглил вчера еще, добавил «n» к -e так как нужно что бы ERROR начиналось с новой строки и сразу за ним следовало сообщение echo

echo -en "usage: $0 filename ...\nERROR:"
  if [ -n "$1" ]
    then
      echo -e "Could not find file $1"
  else
    echo "You did not enter one or more filenames"
  fi
}
Ruson77
() автор топика
Ответ на: комментарий от Ruson77

А также задача заключалась в том, что бы не дублировать слово «ERROR»

Ruson77
() автор топика
Ответ на: комментарий от Ruson77

Ruson77> Вы полностью убрали сообщения об ошибках

Да ну? А вы не пробовали читать, прежде чем писать?

(( $# >= 1 )) || err "$USAGE"
[[ -f "$file" ]] || err $"‘$file’: No such file or directory"

не нужно что бы они отображались точно в таком виде как они есть в моем скрипте

То есть вам не под силу даже текст сообщения исправить с корректного на это ваше «Could not find...»? Как говорятся, язабан.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Да ну? А вы не пробовали читать, прежде чем писать?

Читать пробовал, сообщения исправить под силу, что я впрочем и сделал.

Еще раз спасибо alozovskoy за помощь!

Ruson77
() автор топика

Лучше бы Python взяли для этой цели. Там элементарно всё это делается.

Изучать bash в 2016 году, это как изучать VitaninC для разработки GUI-приложений.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Лучше бы Python взяли для этой цели. Там элементарно всё это делается. Изучать bash в 2016 году, это как изучать VitaninC для разработки GUI-приложений.

Спасибо, возьму на заметку. Вобще то я изучаю bash для работы с файлами на сервере и для передачи даных посредством SSH. Пришло время заменить ftp =)

Ruson77
() автор топика
Ответ на: комментарий от EXL

Там элементарно всё это делается

Вы так говорите, будто на Баше или еще на чем это делается *не* элементарно.

Zmicier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.