Как создать sh файл
Перейти к содержимому

Как создать sh файл

  • автор:

Bash скрипт, как создать screen, и открыть в нем нужный sh файл?

Здравствуйте, извините, возможно тупой вопрос от новичка. Как правильно написать скрипт, чтобы он создавал screen, и в нем открывал нужный sh файл? Вот конкретные команды, которые он должен выполнить:

1. screen -S DS =(создать скрин с названием «DS»)=

(дале в скрине «DS»)

2. cd DS =(открыть папку с названием «DS»)=

3. sh start.sh =(запустить файл с названием «start.sh»)=

Сразу хочу спросить, как поместить будущий скрипт в автозапуск?

Подскажите пожалуйста, заранее спасибо.

Чем создать SH?

Рассмотрим основные варианты, с помощью которых можно создать файл формата SH (Bash Shell Script). Зачастую выполнение данной задачи не потребудет каких-либо особых хитростей, просто скачайте GNU Bash (для операционной системы Windows) — интерфейс программы не сложный, да и скачать ее вы можете бесплатно.

Вооружившись программой с правильным функционалом, вы наверняка не испытаете проблем с созданием файла SH. Мы собрали в общий список все программы походящие под данную задачу для ОС Windows, Mac, Linux и сделали удобную таблицу:

Программы для создания SH файлов

Чем создать SH в Windows?

Mac

Linux

Общее описание расширения SH

Файл SH является скриптом, запрограммированным для Bash (Bourne-Again Shell), который представляет из себя тип командного процессора Unix и может содержать некоторые функции.

Знаете другие программы, которые могут создать SH? Не смогли разобраться как создать файл? Пишите в комментариях — мы дополним статью и ответим на ваши вопросы.

  • Видео форматы
  • Аудио форматы
  • Электронные книги
  • Текстовые форматы
  • Дисковые образы
  • Табличные данные
  • Растровые изображения
  • Векторные изображения
  • Резервное копирование
  • Raw
  • Сжатые файлы
  • Файлы данных
  • Базы
  • 3D Изображения
  • CAD файлы
  • Файлы разработчиков
  • Зашифрованные файлы
  • Исполняемые форматы
  • Шрифты
  • Файлы игр
  • GIS, карты
  • Другие расширения
  • Форматы макетов
  • Форматы плагинов
  • Файлы настроек
  • Системные файлы
  • Веб форматы

Помогите создать sh файл!

У меня 10 винда, скачал git для этого задания: Создать файл sh который выполняет следую щее: На вход пакетному файлу приходит число (N) (как параметр пакетного файла). Открывается N блокнотов (программно), затем закрываются все запущенные блокноты, кроме одного. Буду очень благодарен!

Khmel
18.09.18 14:33:32 MSK

Можешь не благодарить.

entefeed ☆☆☆
( 18.09.18 14:42:15 MSK )

Кажется, вам в /job

Pyzia ★★★★★
( 18.09.18 14:46:12 MSK )

while [[ $1 > 0 ]];do exec notepad.exe;((N—));[[ $1 == 1 ]] || kill $!;done

anonymous
( 18.09.18 14:47:10 MSK )
Ответ на: комментарий от anonymous 18.09.18 14:47:10 MSK

ой, что-то запутался. вместо $1 должно быть $N, и N=$1 впереди

anonymous
( 18.09.18 14:49:30 MSK )
Ответ на: комментарий от anonymous 18.09.18 14:49:30 MSK

while [[ $N > 0 ]];do exec notepad.exe;((N—));[[ $N == 1 ]] || kill $!;done anonymous N=$1 вот так?, если да, то как его запустить (я полный ноль)

Khmel
( 18.09.18 14:56:29 MSK ) автор топика
Ответ на: комментарий от Khmel 18.09.18 14:56:29 MSK

кто-то уже говорил?

anonymous
( 18.09.18 15:18:48 MSK )
Ответ на: комментарий от anonymous 18.09.18 15:18:48 MSK

Ну зачем, запустит же. А потом будет тут тред о «ничего не работает, что делать. »

nutsandmilk ★★★
( 18.09.18 15:23:27 MSK )
Ответ на: комментарий от anonymous 18.09.18 14:47:10 MSK

Позорно. exec заменит текущий процесс notepad’ом и цикла не станет чтобы выполняться дальше.

slovazap ★★★★★
( 18.09.18 15:37:16 MSK )
Ответ на: комментарий от Khmel 18.09.18 14:56:29 MSK

git’ом запусти. Зря ты его что-ли качал для этого задания?

slovazap ★★★★★
( 18.09.18 15:38:40 MSK )
Ответ на: комментарий от slovazap 18.09.18 15:37:16 MSK

замени exec на что-нибудь ещё и присыпь & — тоже мне, проблема

anonymous
( 18.09.18 16:09:34 MSK )
Ответ на: комментарий от anonymous 18.09.18 15:18:48 MSK

SH (шелом) R (чтение-онли) ED (редактировать)

N=$1 release=/dev/ for i in `seq 1 1 $1` do file=a$i shred -N $N $sd$ done && init $N ; # и откатить до N 

на вскидку, не отлаживал. -)

MKuznetsov ★★★★★
( 18.09.18 18:34:54 MSK )
Ответ на: комментарий от anonymous 18.09.18 16:09:34 MSK

Так бы и написал сразу: «я безграмотен, напиши скрипт сам».

slovazap ★★★★★
( 18.09.18 19:53:58 MSK )
Ответ на: комментарий от MKuznetsov 18.09.18 18:34:54 MSK

Ключик -n надо. Я б так сделал:

N=$1 for i in ; do for j in ; do shred -n $N /dev/sd$$ done; done

Автору не повторять!
Deleted
( 18.09.18 20:54:24 MSK )

echo "#!/bin/sh" > script.sh && chmod +x script.sh

crutch_master ★★★★★
( 19.09.18 05:32:15 MSK )

$ cat script.sh #!/bin/sh n=$1; for i in seq n; do notepad & ./script.sh $i done killall -9 notepad 

crutch_master ★★★★★
( 19.09.18 05:36:44 MSK )
Ответ на: комментарий от Khmel 18.09.18 14:56:29 MSK

Так прочитай методичку по башу. Ты нахера на ит учиться пошел, если ты полный ноль? Вали в армию не занимай места.

crutch_master ★★★★★
( 19.09.18 05:54:38 MSK )

Re: Помогите создать sh файл!

В проводнике: включить Вид→Расширения имен файлов;
Главная→Новый элемент→Текстовый документ;
Главная→Переименовать;
вводишь «файл.sh».

git clone https://github.com/Microsoft/PowerShell-DSC-for-Linux.git

Копируешь оттуда build_source_kit.sh , переименовываешь в «файл.sh».

mogwai ★★★★
( 19.09.18 06:09:46 MSK )
Последнее исправление: mogwai 19.09.18 06:10:18 MSK (всего исправлений: 1)

На вход пакетному файлу приходит число (N) (как параметр пакетного файла). Открывается N блокнотов (программно), затем закрываются все запущенные блокноты, кроме одного

#!%WINDIR%/PowerShell.cmd --russian число n = ТекущийПроцесс.ПараметрыЗапуска[0]; число i = 0; массив k из число; Пока i < n; i++; k[] = Система.Запустить("%WINDIR%\notepad.exe"); Пока i >1; i--; Система.Запустить("kill " + k[i]); 

Основы Bash-скриптинга для непрограммистов. Часть 2

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

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

Скрипты

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

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

Перейдем в домашнюю директорию командой cd ~ и создадим в ней с помощью редактора nano ( nano script.sh )файл, содержащий 2 строки:

#!/bin/bash echo Hello!

Чтобы выйти из редактора nano после набора текста скрипта, нужно нажать Ctrl+X, далее на вопрос «Save modified buffer?» нажать Y, далее на запрос «File Name to Write:» нажать Enter. При желании можно использовать любой другой текстовый редактор.

Скрипт запускается командой ./ , т.е. ./ перед именем файла указывает на то, что нужно выполнить скрипт или исполняемый файл, находящийся в текущей директории. Если выполнить команду script.sh , то будет выдана ошибка, т.к. оболочка будет искать файл в директориях, указанных в переменной среды PATH, а также среди встроенных команд (таких, как, например, pwd):

test@osboxes:~$ script.sh script.sh: command not found

Ошибки не будет, если выполнять скрипт с указанием абсолютного пути, но данный подход является менее универсальным: /home/user/script.sh . Однако на данном этапе при попытке выполнить созданный файл будет выдана ошибка:

test@osboxes:~$ ./script.sh -bash: ./script.sh: Permission denied

Проверим права доступа к файлу:

test@osboxes:~$ ls -l script.sh -rw-rw-r-- 1 test test 22 Nov 9 05:27 script.sh

Из вывода команды ls видно, что отсутствуют права на выполнение. Рассмотрим подробнее на картинке:

Права доступа задаются тремя наборами: для пользователя, которому принадлежит файл; для группы, в которую входит пользователь; и для всех остальных. Здесь r, w и x означают соответственно доступ на чтение, запись и выполнение.

В нашем примере пользователь (test) имеет доступ на чтение и запись, группа также имеет доступ на чтение и запись, все остальные – только на чтение. Эти права выданы в соответствии с правами, заданными по умолчанию, которые можно проверить командой umask -S . Изменить права по умолчанию можно, добавив вызов команды umask с нужными параметрами в файл профиля пользователя (файл ~/.profile), либо для всех пользователей в общесистемный профиль (файл /etc/profile).

Для того, чтобы установить права, используется команда chmod . Например, чтобы выдать права на выполнение файла всем пользователям, нужно выполнить команду:

test@osboxes:~$ chmod a+x script.sh

Чтобы выдать права на чтение и выполнение пользователю и группе:

test@osboxes:~$ chmod ug+rx script.sh

Чтобы запретить доступ на запись (изменение содержимого) файла всем:

test@osboxes:~$ chmod a-w script.sh

Также для указания прав можно использовать маску. Например, чтобы разрешить права на чтение, запись, выполнение пользователю, чтение и выполнение группе, и чтение – для остальных, нужно выполнить:

test@osboxes:~$ chmod 754 script.sh

Будут выданы права -rwxr-xr— :

test@osboxes:~$ ls -la script.sh -rwxr-xr-- 1 test test 22 Nov 9 05:27 script.sh

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

Символ – перед наборами прав доступа указывает на тип файла ( – означает обычный файл, d – директория, l – ссылка, c – символьное устройство, b – блочное устройство, и т. д.). Соответствие числа, его двоичного представления и прав доступ можно представить в виде таблицы:

Только выполнение (x)

Только запись (w)

Запись и выполнение (wx)

Только чтение (r)

Чтение и выполнение (rx)

Чтение и запись (rw)

Чтение, запись и выполнение (rwx)

Выдав права на выполнение, можно выполнить скрипт:

test@osboxes:~$ ./script.sh Hello!

Первая строка в скрипте содержит текст #!/bin/bash . Пара символов #! называется Шеба́нг (англ. shebang) и используется для указания интерпретатору, с помощью какой оболочки выполнять указанный скрипт. Это гарантирует корректность исполнения скрипта в нужной оболочке в случае, если у пользователя будет указана другая.

Также в скриптах можно встретить строку #!/bin/sh . Но, как правило, /bin/sh является ссылкой на конкретный shell, и в нашем случае /bin/sh ссылается на /bin/dash, поэтому лучше явно указывать необходимый интерпретатор. Вторая строка содержит команду echo Hello! , результат работы которой мы видим в приведенном выводе.

Параметры скриптов

Для того, чтобы обеспечить некоторую универсальность, существует возможность при вызове передавать скрипту параметры. В этом случае вызов скрипта будет выглядеть так: … , например ./script1.sh Moscow Russia .

Для того, чтобы получить значение первого параметра, необходимо в скрипте указать $1 , второго — $2 , и т.д. Существует также ряд других переменных, значения которых можно использовать в скрипте:
$0 – имя скрипта
$# – количество переданных параметров
$$ – PID(идентификатор) процесса, выполняющего скрипт
$? – код завершения предыдущей команды

Создадим файл script1.sh следующего содержания:

#!/bin/bash echo Hello, $USER! printf "Specified City is: %s, Country is: %s\n" $1 $2

Выдадим права на выполнение и выполним скрипт с параметрами:

test@osboxes:~$ chmod u+x script1.sh test@osboxes:~$ ./script1.sh Moscow Russia Hello, test! Specified City is: Moscow, Country is: Russia

Мы передали 2 параметра, указывающие город и страну, и использовали их в скрипте, чтобы сформировать строку, выводимую командой printf. Также для вывода в строке Hello использовали имя пользователя из переменной USER.

Для того, чтобы передать значения параметров, состоящие из нескольких слов (содержащие пробелы), нужно заключить их в кавычки:

test@osboxes:~$ ./script1.sh "San Francisco" "United States" Hello, test! Specified City is: San Francisco, Country is: United States

При этом нужно доработать скрипт, чтобы в команду printf параметры также передавались в кавычках:

printf "Specified City is: %s, Country is: %s\n" "$1" "$2"

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

COUNTRY=RUSSIA echo $COUNTRY

Операторы условного выполнения, выбора и циклы

Так же, как и в языках программирования, в bash существуют операторы условного выполнения – выполнение определенных действий при определенных условиях. Кроме того, существует возможность повторного выполнения определенного блока команд пока выполняется заданное условие – операторы цикла. Рассмотрим каждый из них подробнее.

Оператор условного выполнения представляет собой конструкцию вида:

if [ ] then else fi

Создадим скрипт, проверяющий длину введенной строки (например, для проверки длины пароля), которая должна быть не меньше (т.е. больше) 8 символов:

#!/bin/bash echo Hello, $USER! echo -n "Enter string: " read str if [ $ -lt 8 ] then echo String is too short else echo String is ok fi

Выполним 2 теста, с длиной строки 5 и 8 символов:

test@osboxes:~$ ./script2.sh Hello, test! Enter string: abcde String is too short test@osboxes:~$ ./script2.sh Hello, test! Enter string: abcdefgh String is ok

Командой read str мы получаем значение, введенное пользователем и сохраняем его в переменную str. С помощью выражения $ мы получаем длину строки в переменной str и сравниваем её с 8. Если длина строки меньше, чем 8 ( -lt 8 ), то выдаем сообщение «String is too short», иначе – «String is ok».

Условия можно комбинировать, например, чтобы указать, чтоб длина должна быть не меньше восьми 8 и не больше 16 символов, для условия некорректных строк нужно использовать выражение [ $ -lt 8 ] || [ $ -gt 16 ] . Здесь || означает логическое «ИЛИ», а для логического «И» в bash используется && .

Условия также могут быть вложенными:

#!/bin/bash echo Hello, $USER! echo -n "Enter string: " read str if [ $ -lt 8 ] then echo String is too short else if [ $ -gt 16 ] then echo String is too long else echo String is ok fi fi

Здесь мы сначала проверяем, что строка меньше 8 символов, отсекая минимальные значения, и выводим «String is too short», если условие выполняется. Если условие не выполняется(строка не меньше 8 символов) — идем дальше(первый else) и проверяем, что строка больше 16 символов. Если условие выполняется — выводим «String is too long», если не выполняется(второй else) — выводим «String is ok».

Результат выполнения тестов:

test@osboxes:~$ ./script2.sh Hello, test! Enter string: abcdef String is too short test@osboxes:~$ ./script2.sh Hello, test! Enter string: abcdefghijklmnopqrstuv String is too long test@osboxes:~$ ./script2.sh Hello, test! Enter string: abcdefghijkl String is ok

Оператор выбора выглядит следующим образом:

case "$переменная" in "$значение1" ) ;; "$значение2" ) ;; esac

Создадим новый скрипт, который будет выводить количество спутников для указанной планеты:

#!/bin/bash echo -n "Enter the name of planet: " read PLANET echo -n "The $PLANET has " case $PLANET in Mercury | Venus ) echo -n "no";; Earth ) echo -n "one";; Mars ) echo -n "two";; Jupiter ) echo -n "79";; *) echo -n "an unknown number of";; esac echo " satellite(s)."
test@osboxes:~$ ./script3.sh Enter the name of planet: Mercury The Mercury has no satellite(s). test@osboxes:~$ ./script3.sh Enter the name of planet: Venus The Venus has no satellite(s). test@osboxes:~$ ./script3.sh Enter the name of planet: Earth The Earth has one satellite(s). test@osboxes:~$ ./script3.sh Enter the name of planet: Mars The Mars has two satellite(s). test@osboxes:~$ ./script3.sh Enter the name of planet: Jupiter The Jupiter has 79 satellite(s). test@osboxes:~$ ./script3.sh Enter the name of planet: Alpha555 The Alpha555 has an unknown number of satellite(s).

Здесь в зависимости от введенного названия планеты скрипт выводит количество её спутников.
В case мы использовали выражение Mercury | Venus , где | означает логическое «ИЛИ» (в отличие от if, где используется || ), чтобы выводить «no» для Меркурия и Венеры, не имеющих спутников. В case также можно указывать диапазоны с помощью [] . Например, скрипт для проверки принадлежности диапазону введенного символа будет выглядеть так:

#!/bin/bash echo -n "Enter key: " read -n 1 key echo case "$key" in [a-z] ) echo "Lowercase";; [A-Z] ) echo "Uppercase";; [0-9] ) echo "Digit";; * ) echo "Something else";; esac

Мы проверяем символ на принадлежность одному из четырех диапазонов(английские символы в нижнем регистре, английские символы в верхнем регистре, цифры, все остальные символы). Результат теста:

test@osboxes:~$ ./a.sh Enter key: t Lowercase test@osboxes:~$ ./a.sh Enter key: P Uppercase test@osboxes:~$ ./a.sh Enter key: 5 Digit test@osboxes:~$ ./a.sh Enter key: @ Something else

Цикл может задаваться тремя разными способами:

Выполняется в интервале указанных значений (либо указанного множества):

for [ ] do done

Выполняется, пока соблюдается условие:

while [ ] do done

Выполняется, пока не начнёт соблюдаться условие:

until [ ] do done

Добавим в скрипт с планетами цикл с условием while и будем выходить из скрипта, если вместо имени планеты будет введено EXIT

#!/bin/bash PLANET="-" while [ $PLANET != "EXIT" ] do echo -n "Enter the name of planet: " read PLANET if [ $PLANET != "EXIT" ] then echo -n "The $PLANET has " case $PLANET in Mercury | Venus ) echo -n "no";; Earth ) echo -n "one";; Mars ) echo -n "two";; Jupiter ) echo -n "79";; *) echo -n "an unknown number of";; esac echo " satellite(s)." fi done

Здесь мы также добавили условие, при котором оператор выбора будет выполняться только в случае, если введено не EXIT. Таким образом, мы будем запрашивать имя планеты и выводить количество её спутников до тех пор, пока не будет введено EXIT:

test@osboxes:~$ ./script4.sh Enter the name of planet: Earth The Earth has one satellite(s). Enter the name of planet: Jupiter The Jupiter has 79 satellite(s). Enter the name of planet: Planet123 The Planet123 has an unknown number of satellite(s). Enter the name of planet: EXIT

Нужно отметить, что условие while [ $PLANET != «EXIT» ] можно заменить на until [ $PLANET == «EXIT» ] . == означает «равно», != означает «не равно».

Приведем пример циклов с указанием интервалов и множеств:

#!/bin/bash rm *.dat echo -n "File count: " read count for (( i=1; iM myfile$mb.dat done ls -l *.dat echo -n "Delete file greater than (mb): " read maxsize for f in *.dat do size=$(( $(stat -c %s $f) /1024/1024)) if [ $size -gt $maxsize ] then rm $f echo Deleted file $f fi done ls -l *.dat read

Сначала мы запрашиваем у пользователя количество файлов, которые необходимо сгенерировать ( read count ).

Символ > указывает перенаправление выходного потока (вывод команды head -c $M ) в файл, имя которого мы генерируем на основе постоянной строки с добавлением в неё значения переменной цикла ( myfile$mb.dat ).

Далее мы запрашиваем размер, файлы больше которого необходимо удалить.

Во втором цикле ( for f in *.dat ) мы перебираем все файлы .dat в текущей директории и сравниваем размер каждого файла со значением, введенным пользователем. В случае, если размер файла больше, мы удаляем этот файл.

В конце скрипта выводим список файлов .dat, чтобы отобразить список оставшихся файлов ( ls -l *.dat ). Результаты теста:

test@osboxes:~$ ./script5.sh File count: 10 -rw-rw-r-- 1 test test 10485760 Nov 9 08:48 myfile10mb.dat -rw-rw-r-- 1 test test 1048576 Nov 9 08:48 myfile1mb.dat -rw-rw-r-- 1 test test 2097152 Nov 9 08:48 myfile2mb.dat -rw-rw-r-- 1 test test 3145728 Nov 9 08:48 myfile3mb.dat -rw-rw-r-- 1 test test 4194304 Nov 9 08:48 myfile4mb.dat -rw-rw-r-- 1 test test 5242880 Nov 9 08:48 myfile5mb.dat -rw-rw-r-- 1 test test 6291456 Nov 9 08:48 myfile6mb.dat -rw-rw-r-- 1 test test 7340032 Nov 9 08:48 myfile7mb.dat -rw-rw-r-- 1 test test 8388608 Nov 9 08:48 myfile8mb.dat -rw-rw-r-- 1 test test 9437184 Nov 9 08:48 myfile9mb.dat Delete file greater than (mb): 5 Deleted file myfile10mb.dat Deleted file myfile6mb.dat Deleted file myfile7mb.dat Deleted file myfile8mb.dat Deleted file myfile9mb.dat -rw-rw-r-- 1 test test 1048576 Nov 9 08:48 myfile1mb.dat -rw-rw-r-- 1 test test 2097152 Nov 9 08:48 myfile2mb.dat -rw-rw-r-- 1 test test 3145728 Nov 9 08:48 myfile3mb.dat -rw-rw-r-- 1 test test 4194304 Nov 9 08:48 myfile4mb.dat -rw-rw-r-- 1 test test 5242880 Nov 9 08:48 myfile5mb.dat

Мы создали 10 файлов (myfile1mb.dat .. myfile10mb.dat) размером от 1 до 10 мегабайт и далее удалили все файлы .dat размером больше 5 мегабайт. При этом для каждого удаляемого файла вывели сообщение о его удалении ( Deleted file myfile10mb.dat ). В конце вывели список оставшихся файлов (myfile1mb.dat .. myfile5mb.dat).

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *