кажется, вам нужна точка (. )нравится
#!/bin/sh
. includeMe.sh
но если вы хотите просто запустить все скрипты из команды, например, без императивного "включить"...
exit
, она выручит ваш текущий сеанс оболочки просто попробуйте создать скрипт
script.sh:
#!/bin/bash
echo 'bye world';
exit
и запустите его как ./script.sh
и сравните с../script.sh
Вместо этого используйте awk
и отформатируйте поле до нужной ширины с помощью sprintf()
. Скорее всего, это будет более прямолинейно, чем с sed
.
$ cat file
1000 : final time
1000 : print time
0.1 : time step
$ awk -F ':' -v sect=' final time' -v val='100' 'BEGIN { OFS=FS } $2 == sect { $1 = sprintf("%-16s", val) }; 1' file
100 : final time
1000 : print time
0.1 : time step
Это обрабатывает строки ввода, состоящие из:
-полей с разделителями. Когда второе поле соответствует строке, заданной для переменной sect
в командной строке awk
, первое поле заменяется значением, заданным для val
в командной строке.
Способ использования sprintf()
здесь со строкой формата %-16s
гарантирует, что вы получите выровненное по левому краю -значение длиной ровно 16 символов (, дополненное справа пробелами ), перед :
.
Для установки «временного шага» с помощью той же команды требуется только подставить другие значения для sect
и val
:
$ awk -F ':' -v sect=' time step' -v val='0.12121212' 'BEGIN { OFS=FS } $2 == sect { $1 = sprintf("%-16s", val) }; 1' file
1000 : final time
1000 : print time
0.12121212 : time step
Пробел в начале значения sect
необходим для учета пробела в данных после :
. Вы также можете сделать
$ awk -F ':' -v sect='time step' -v val='0.12121212' 'BEGIN { OFS=FS } $2 == " " sect { $1 = sprintf("%-16s", val) }; 1' file
1000 : final time
1000 : print time
0.12121212 : time step
(Я переместил пробел из значения sect
в тест против значения второго столбца.)
Предложение для скрипта (, использующего статический путь к входному файлу и который просто выводит измененные данные):
#!/bin/sh
filepath=some/file/path
if [ "$#" -ne 2 ]; then
echo expecting two arguments >&2
exit 1
fi
case $1 in
--final-time) sect='final time' ;;
--print-time) sect='print time' ;;
--time-step) sect='time step' ;;
*)
printf 'Unknown argument: %s\n' "$1" >&2
exit 1
esac
val=$2
awk -F ':' -v sect="$sect" -v val="$val" '
BEGIN { OFS=FS }
$2 == " " sect { $1 = sprintf("%-16s", val) }; 1' "$filepath"