Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Имя переменной в переменной. Bash

Есть такая конструкция: внутри основного скрипта подключается конфиг
source ./fw_param.cfg

внетри него лежит список переменных, имена которых отличаются только первой буквой:
esp = 123
isp = 345
rsp = 678

В основном скрипте есть входной параметр и огромный case, который перебирает значения этого параметра и присваивает соответствующий из конфига. Сложно и требует доработки каждый раз, как приходит новая буква. Хотелось бы просто в конфиг добавдять новую строчку, а в основном иметь что-то типа:
#!/bin/sh
var=$1sp
получить var из конфига
echo $var

Теперь в переменной var лежит имя переменной из конфига, как добыть значение?
Ответ: l_kator,
#!/bin/sh
source ./fw_param.cfg

eval var=\$$1sp
echo $var
Вопрос: Переменная bash, вывод tail -f

Всем доброго дня.
Если сможете помочь буду очень признателен.
Нужно чтобы сервер запускался только после того как увидит в логе "/home/ab.tt.ru/logs/catrina.out" и "/home/cc.tt.ru/logs/catrina.out" tail -f ***** CCRady *****" "***** ABRedy *****"
Аутентификация происходит по ключу.
Создал данную конструкцию но она не работает.
Bash
1
2
3
4
5
6
7
8
9
abc=1.2.3.4
abcd=/home/ab.tt.ru/catrina.sh
checkingABBACH=`ssh admin@$1.2.3.4 tail -f /home/ab.tt.ru/logs/catrina.out | grep "***** CCRady *****" | awk '{print $6,$7,$8}`
checkingCCBACH=`ssh admin@$1.2.3.4 tail -f /home/cc.tt.ru/logs/catrina.out | grep "***** ABRedy *****" | awk '{print $6,$7,$8}`
if [ -n "$checkingABBACH $checkingCCBACH" ]
    then
        echo "ssh admin@$abc $abcd start"
        ssh admin@$abc $abcd start
fi
Ответ: Все спасибо, нашел способ, скрипт запустить локально с изменениями
grep -m 1 "***** ABRedy *****" <(tail -f -n 0 $ablog)
Вопрос: bin/bash: error на centos

parallel -j0 ping -nc 3 ::: foss.org.my gnu.org freenetproject.org

parallel: Warning: YOU ARE USING --tollef. IF THINGS ARE ACTING WEIRD USE --gnu.
parallel: Warning: --tollef is obsolete and will be retired 20140222.
parallel: Warning: See: http://lists.gnu.org/archive/html/parallel/2013-02/msg00018.html
/bin/bash: -c: option requires an argument
/bin/bash: 3: command not found
/bin/bash: foss.org.my: command not found
/bin/bash: :::: command not found
/bin/bash: gnu.org: command not found
/bin/bash: freenetproject.org: command not found
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination


на ubuntu тотже самый код работает впринципе неплохо.
parallel установлен через yum.
систему обновил yum update
Ответ: а что у вас в файлах /etc/parallel/config, ~/.parallel/config и переменной окружения $PARALLEL ?
Вопрос: Bash

Добрый день!

Пусть есть переменная
$Params =  "-I test 1 -s 2001:abcd:134::36 -j DROP"

Как в Params получить вот это?
$Params = "-I test 1 -s 2001:abcd:134::36/64 -j DROP"


Спасибо.
Ответ:
bash-4.3$ p="-I test 1 -s 2001:abcd:134::36 -j DROP"
bash-4.3$ s=${p/ -j/\/64 -j}
bash-4.3$ echo $s
-I test 1 -s 2001:abcd:134::36/64 -j DROP
Вопрос: Переменные bash

Как перевести двоичное число, передаваемое в качестве первого параметра, в десятичное число?
Ответ:
  1. Вызывают скрипт ./имя_скрипта [аргумент1 [аргумент2 …]] для чего присваивают ему свойство исполняемости
  2. Интерпретатор используют bash(не sh — он сильно урезанный) для чего в первой строке скрипта указывают шебанг #!/bin/bash
  3. Формат команды read имя_переменной, а $1 — это позиционный параметр в строке вызова скрипта (см п.1). Определитесь или то, или это.
P.S. Код приято указывать не картинкой, а текстом в соответствующих тэгах [CODE][/CODE] или [BASH][/BASH]
Вопрос: Bash скрипт для скачивания картинок с веб-сайта

Нашел замечательный скрипт с данного источника -

#!/bin/bash
#Description: Images downloader
#Filename: img_downloader.sh
if [ $# -ne 3 ];
then
echo "Usage: $0 URL -d DIRECTORY"
exit -1
fi
for i in {1..4}
do
case $1 in
-d) shift; directory=$1; shift ;;
*) url=${url:-$1}; shift;;
esac
done
mkdir -p $directory;
baseurl=$(echo $url | egrep -o "https?://[a-z.]+")
curl –s $url | egrep -o "<img src=[^>]*>" | sed 's/<img src=\"\([^"]*\).*/\1/g' > /tmp/$$.list
sed -i "s|^/|$baseurl/|" /tmp/$$.list
cd $directory;
while read filename;
do
curl –s -O "$filename" --silent
done < /tmp/$$.list


Но к сожалению при выполнение команды под root пользователем, выдает Permission Denied. Подскажите в чем может быть проблема.
sh-3.2# ./img_downloader.sh http://www.flickr.com/search/?q=linux -d images
sh: ./img_downloader.sh: Permission denied
sh-3.2# whoami
root
sh-3.2# 
Ответ: брад галимый. я скачивал коллекцию картинок на вноый товар с сайта одной строкой по типу xsel | wget -O - | sed | wget

ну иногда небольшие вариации, например если надо переименовал файл..

xsel -b|wget -i - -O -|sed -rn 's/^.*"(http[^"]+.(gif|jpg|jpeg)).*/\1/p' |sed 's/thumb/full/' | wget -ci -


что-то по типу этого. но там не было двух картинок (нужных мне) указанных в одной строке исходников. (и второй сед явно не обязателен :) )
Вопрос: Подскажите, как правильно сделать (bash, echo, pipes)

Приветствую!

Я не очень опытный пользователь Linux, поэтому сорри за возможно ламерский вопрос.
У меня задача: в CentOS7 строкой в файле bash (или в командной строке) сделать следующее: в определенный файл (допустим /tmp/my.txt) записать некую константную строку (допустим, "My PC hostname is"), затем добавить пробел и в той же строке вывести текущее имя хоста, получаемое выполнением команды hostname.

Что то типа такого (но так не работает - выводит только строку с именем хоста, без предшествующей константной части, это я привел для иллюстрации того, как я пытаюсь сделать):

 echo $'My PC hostname is ' | hostname >> /tmp/my.txt 


P.S. подсветки кода sh/bash на форуме, как я понял, нет, так что извините за некорретную подсветку

Спасибо.
Ответ:
Los Pejos
Приветствую!

Я не очень опытный пользователь Linux, поэтому сорри за возможно ламерский вопрос.
У меня задача: в CentOS7 строкой в файле bash (или в командной строке) сделать следующее: в определенный файл (допустим /tmp/my.txt) записать некую константную строку (допустим, "My PC hostname is"), затем добавить пробел и в той же строке вывести текущее имя хоста, получаемое выполнением команды hostname.

Что то типа такого (но так не работает - выводит только строку с именем хоста, без предшествующей константной части, это я привел для иллюстрации того, как я пытаюсь сделать):

 echo $'My PC hostname is ' | hostname >> /tmp/my.txt 


P.S. подсветки кода sh/bash на форуме, как я понял, нет, так что извините за некорретную подсветку

Спасибо.

Вы не поняли, что значит | (пайп). погуглите на тему.
Вопрос: Помогите с bash новичку

Новичок в bash'е

есть папка OPTION_FL
-- подпапки
--- BATO
--- MCRY
--- XCBO

В каждой подпапке много zip архивов.

Как пробежаться по каждой подпапке и по каждому zip архиву внутри подпапки разархировать все zip и сложить в один файл ?
Ответ:
x17.mstu
x17.mstu,

find -type f -iname '*.gz' -execdir bash -c 'mkdir -p photo ; gunzip -d photo {}' \;


Попробовал вот так но папка photo не создается, это папка куда хочу положить все разипаные файлы

а сперва создать папку, а потом уже разархивировать туда?
Вопрос: Реализовать Bash скрипт

Входные данные:

Две папки с файлами A и B

Выходные данные:

Пустая папка, в которой будут заложены изображения C
-----------------------------------------------------------------------

Задание

Отобрать файлы которые находятся в папке A и B , удалить один из дубликатов, а второй переместить в папку C. Одинаковыми файлами (дубликатами) можно считать те, чьи названия файлов совпадают.

Реализовать как Bash скрипт.
Структура выполнения скрипта :
removedupl [A folder adress] [B folder adress] [C folder adress]
- Пример:
./removedupl /home/students/a /home/students/b /home/students/c

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/bin/bash
 
remove_dupe(){  
 
    if [[ ! -f $1 ]]; then
 
        return
 
    fi
    if [[ ! -f $2 ]]; then
 
        return  
 
    fi
    filename="${1##*/}" 
    if [[ -f "$3/$filename" ]]; then                
        exit -1 
 
    fi
    rm $2   
    mv $1 $3
}
 
###################################
 
# Запись данных в папку A  #
 
###################################
 
i=0
 
for entry in "$1"/*
 
do
 
    filename="${entry##*/}"
 
    file_list_path_A[$i]="$entry" 
 
    filename="${filename%.*}"
 
    file_list_A[$i]="$filename" 
 
        i=$(($i+1))
 
done
 
echo -e "\nFaili mape A:\n"
 
for var in "${file_list_A[@]}"
 
do
 
    echo -e -n "$var\n"
done
 
###################################
 
# Запись данных в папку B  #
 
###################################
 
i=0
 
for entry in "$2"/*
 
do
 
    filename="${entry##*/}"
 
    file_list_path_B[$i]="$entry"
 
    filename="${filename%.*}"
 
    file_list_B[$i]="$filename"
 
    i=$(($i+1))
 
done
 
echo -e "\nFaili mape B:\n"
 
 
 
for var in "${file_list_B[@]}"
 
do
 
    echo -e -n "$var\n"
 
done
 
########################################
 
#Сравнение и удаление дубликатов #
 
########################################
 
for fileA in "${file_list_path_A[@]}"
 
do  
 
    filename_A="${fileA##*/}"   
 
    for fileB in "${file_list_path_B[@]}"   
 
    do      
 
        filename_B="${fileB##*/}"           
 
        if [ "$filename_A" = "$filename_B" ]; then                  
 
            remove_dupe $fileA $fileB $3        
 
        fi  
 
    done
 
done
 
exit 0
Ответ:
Bash
1
2
3
comm -12 <(ls "$1") <(ls "$2") |
sed ":a;\$! N;s/\n\s*/\" \"/;ta;s/^\s*\|$/\"/g;s/.*/cd \"$1\"\nmv -t \"$3\" &\ncd \"$2\"\nrm &/" | 
bash
Вопрос: Помогите не передаются входные программы из Autosys в bash script

bash-4.1$ /home/kushnira/archive_infile.bash $${FILE_DIR} $${ARCH_DIR} OPTION TL

сам скрипт archive_infile.bash:

#!/bin/bash

echo "Starting..."

INDIR=$1;
ARCH_DIR=$2;
ASSET_CLASS=$3;
ASSET_LEVEL=$4;
TIMESTAMP=$(date +%Y%m%d%H%M%S);

zip -r $ARCH_DIR$ASSET_CLASS\_$ASSET_LEVEL\_$TIMESTAMP.zip $INDIR;

входный параметр $${FILE_DIR}=/home/kushnira/FILE_DIR
$${ARCH_DIR}=/home/kushnira/$INDIR

При запуске получаю ошибку
Starting...
zip warning: name not matched: 2064455{FILE_DIR}

zip error: Nothing to do! (try: zip -r 2064455{ARCH_DIR}OPTION_TL_20180710142227.zip . -i 2064455{FILE_DIR})
bash-4.1$
Ответ:
x17.mstu
bash-4.1$ /home/kushnira/archive_infile.bash $${FILE_DIR} $${ARCH_DIR} OPTION TL


сам скрипт archive_infile.bash:

#!/bin/bash

echo "Starting..."

INDIR=$1;
ARCH_DIR=$2;
ASSET_CLASS=$3;
ASSET_LEVEL=$4;
TIMESTAMP=$(date +%Y%m%d%H%M%S);

zip -r $ARCH_DIR$ASSET_CLASS\_$ASSET_LEVEL\_$TIMESTAMP.zip $INDIR;

входный параметр $${FILE_DIR}=/home/kushnira/FILE_DIR
$${ARCH_DIR}=/home/kushnira/$INDIR

При запуске получаю ошибку
Starting...
        zip warning: name not matched: 2064455{FILE_DIR}

zip error: Nothing to do! (try: zip -r 2064455{ARCH_DIR}OPTION_TL_20180710142227.zip . -i 2064455{FILE_DIR})
bash-4.1$


Мессир, вы неправильно готовите

Ваш Вызов превращается в тыкву следущее (мои комментарии):

 
## Абсолютное имя выполняемого файла (правильно)
/home/kushnira/archive_infile.bash 

## pid текущего процесса, превращается в текущий Pid 2064455
$$ 

## та строка которую вы видите вместо части имени файла
{FILE_DIR} 

## pid текущего процесса, превращается в текущий Pid 2064455
$$
{ARCH_DIR} 
## остаток строки
OPTION TL


Попробуйте:
bash-4.1$ /home/kushnira/archive_infile.bash ${FILE_DIR} ${ARCH_DIR} OPTION TL


Где
${FILE_DIR} - значение переменной окружения FILE_DIR (Она у Вас определена?)
${ARCH_DIR} - значение переменной окружения ARCH_DIR (Она у Вас определена?)

проверить можно:
env | grep FILE_DIR
env | grep ARCH_DIR

если не определено, пропишите явно
проверьте что эти директории существуют