[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Подстановка переменного числа аргументов



> Здравствуйте.

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

> Задача. В зависимости от некоторых условий необходимо вызвать команду с 
> дополнительными аргументами или без них. Например:

В самых сложных и запутанных случаях помогает shquote, который ниже
и eval. Решение -- самое общее и переносимое на любой POSIX и даже
недо-POSIX шел.

shquote (){
    # $1 - string to shquote
    __cmd=`printf '%s\n' "$1" | sed "s|'|'\\\\\''|g"`
    printf "%s\n" "'$__cmd'"
}

Пример. Есть имя файла с пробелами, кавчками одинарными и двойными.
Мы хотим с ним что-то сделать.

   0 777-sample>ls -la
   total 8
   drwxr-xr-x   2 cheusov  wheel   512 Oct 31 00:28 .
   drwxrwxrwt  26 root     wheel  1536 Oct 31 00:27 ..

   0 777-sample>~/tmp/777.sh 

   0 777-sample>ls -la
   total 8
   drwxr-xr-x   2 cheusov  wheel   512 Oct 31 00:28 .
   drwxrwxrwt  26 root     wheel  1536 Oct 31 00:27 ..
   -rw-r--r--   1 cheusov  wheel     0 Oct 31 00:28 Alan Parson's Project.flac
   -rw-r--r--   1 cheusov  wheel     0 Oct 31 00:28 And doubler quotes "" too!!!.flac
   -rw-r--r--   1 cheusov  wheel     0 Oct 31 00:28 King Cromson.flac

   0 777-sample>cat ~/tmp/777.sh
   #!/bin/sh

   shquote (){
      # $1 - string to shquote
      __cmd=`printf '%s\n' "$1" | sed "s|'|'\\\\\''|g"`
      printf "%s\n" "'$__cmd'"
   }

   create_file (){
      # $1 - filename
      cmd="touch "`shquote "$1"`
      eval "$cmd"
   }

   create_file "King Cromson.flac"
   create_file "Alan Parson's Project.flac"
   create_file 'And doubler quotes "" too!!!.flac'

   0 777-sample>

С многосложными опциями ситуация та же. Просто итераций shquote больше,
по одной на каждую опцию. В баше builtin printf '%q' делает что-то похожее.

-- 
Best regards, Aleksey Cheusov.


Reply to: