Как передать несколько аргументов для выполнения с помощью сценария .sh

На случай, если вы не хотите связываться с вашим локальным файлом ~ / .ssh / config и опция - no-motd у вас тоже не работает, мне удалось установить переменную env RSYNC_RSH .

RSYNC_RSH="ssh -q" rsync

Вы также можете попробовать использовать параметр rsync -e

rsync -e 'ssh -q'
2
23.02.2018, 05:19
4 ответа

El método más fácil para leer argumentos se puede describir de la siguiente manera;

Cada argumento es referenciado y analizado por $IFSo internal file separatoractualmente definido. El carácter predeterminado es un espacio.

Por ejemplo, tome lo siguiente;#./script.sh arg1 arg2

La lista de argumentos en ese ejemplo es arg1 = $1y arg2 = $2, que se puede reescribir como arg1 arg2 = $@.

Otra nota es el uso de una lista de registros, ¿con qué frecuencia cambia eso? Mi suposición es diaria. ¿Por qué no usar la salida del directorio como matriz de su ciclo iterativo? Por ejemplo;

for i in $(ls /path/to/logs); do
 ./workaround.sh $i;
done

O mejor aún, pase al uso de functionsen bash para eliminar el desorden.

function process_file()
{
  # transfer file code/command
}

function iterate_dir()
{
  local -a dir=($(ls $1))
  for file in ${dir[@]}; do
    process_file $file
  done
}

iterate_dir /path/to/log/for

Si bien estas son meras sugerencias para mejorar su conocimiento de secuencias de comandos de shell, debo saber si hay un error que está recibiendo y también necesitaría conocer los detalles de cada código de secuencias de comandos y/o funcionalidad. Hacer uso del argumento -xtambién ayuda a depurar secuencias de comandos.

Si simplemente está transfiriendo registros, es posible que desee eliminar todos los scripts y utilizar rsync, rsyslogo syslog, ya que todos son mucho más adecuados para la tarea en cuestión.

5
27.01.2020, 21:52

dentro del script :necesita un bucle de lectura como while read ; do......... ; done < filenamepara tratar las líneas como variable $REPLY...

por ejemplo

while read 
do
mv $REPLY $REPLY.old
done < liste.txt

cambiará el nombre de cualquier archivo desde dentro de liste.txt a filename.old

ahora tiene la estructura que puede adaptar a sus necesidades dependiendo de lo que quiera decir con "en el nombre de cada archivo de registro en list.txt para ejecutar".:)

2
27.01.2020, 21:52

( Nota:Personalmente creo que el enfoque de Kusalananda es el mejor en este escenario específico, por lo que agregaré información explicativa y recomendaciones)


No leer líneas confor

Usando ese enfoque usted:

  • Confíe en la división de palabras para hacer que las cosas funcionen.
  • Están sujetos a efectos secundarios no deseados como globbing .
  • Sorber todo el archivo en la memoria de una sola vez (puede ser un problema con archivos grandes ).

El enfoque while+ reades preferible pero no es una solución a prueba de balas -:

while IFS= read -r line; do
  # Your code here
done < file

Cita tus variables

Escriba "$i"en lugar de $i. Las variables sin comillas son probablemente la principal fuente de errores y agujeros de seguridad en los scripts de shell.

Preguntas relacionadas:

Utilice $(...)en lugar de`...`

$(...)es compatible con POSIX -y se puede anidar más fácilmente.


También puede modificar su secuencia de comandos para admitir múltiples argumentos e incluso una opción --batch.

Si no sabe por dónde empezar, tengo un script de muestra/plantilla que admite esas características(usa sintaxis específica de Bash -, aunque ).

Ejemplo de uso:

$ cat list.txt
list_item_1
list_item_2
list_item_3
$ script --batch list.txt item_1 item_2
Operands:
  1: [list_item_1]
  2: [list_item_2]
  3: [list_item_3]
  4: [item_1]
  5: [item_2]
2
27.01.2020, 21:52

Возможно, я неправильно прочитал этот вопрос, но то, как я его прочитал, заключалось в том, как заставить мой личный скрипт принимать несколько аргументов, например, так, как wget может выполнить «wget url1 url2 url3»

вставьте весь свой сценарий в следующее место, где написано «строки из моего сценария», и сохраните этот файл как новый сценарий.:

ARGUMENTS=$(echo "$@"| tr " " "\n") ; while read A; do "lines from my script";done < "$ARGUMENTS"

Обратите внимание, что если ваш сценарий ссылается на $1, вам придется изменить его на $A и, конечно же, проверить все другие ссылки.

аргументы хранятся в одной строке, разделенной в переменной с именем $@. этот хак использует tr для обмена пробелами с новой строкой и сохраняет это в новой переменной с именем ARGUMENTS. остальная часть скрипта запускает ваш скрипт для каждой строки этой переменной.

Я написал это, чтобы получить мой парсер bash, который принимает ОДИН и только один аргумент для приема нескольких URL-адресов, поэтому он может не работать со сценариями, которые обычно принимают более одного аргумента

0
01.01.2021, 22:49

Теги

Похожие вопросы