У Вас почти был он. $argv является массивом, подобным жемчугу. $argv [0] является самим сценарием, как 0$ в оболочке или $ARGV [0] в жемчуге. $argv [1] был бы первым аргументом, переданным сценарию, но Ваше использование, вероятно, изменится, так как можно сделать кошку в сценарии PHP. Принятие Вашего сценария PHP stconvert
, использование теперь было бы stconvert simplifiedstory > traditionalstory
.
#!/usr/bin/php
<?php
define("MEDIAWIKI_PATH", "/home/a1/mediawiki-1.13.0/");
require_once "mediawiki-zhconverter.inc.php";
$text = shell_exec("cat $argv[1]");
echo MediaWikiZhConverter::convert($text, "zh-tw") , ",";
?>
Проблема здесь - это find_str
строка, которая затем используется в качестве списка строк. комментарий jw013 корректен, и действительно читайте, я пытаюсь поместить команду в переменную, но сложные случаи всегда перестали работать!. Вы не помещаете целую команду в переменную, но проблема возникает, как только Вы пытаетесь наполнить несколько слов в строковой переменной.
В оболочках Границы/POSIX это - необходимое зло. Но в ksh/bash/zsh, существует лучший путь: используйте массив.
#!/bin/bash
excl_d=("excl*_dirx" "excl*_diry")
find_str=( . -type f \! \( )
for ((i=0 ; i<$((${#excl_d[*]})) ; i++)); do
if [[ $i > 0 ]]; then
find_str+=( -o )
fi
find_str+=( -path "./${excl_d[i]}/*" )
done
find_str+=( \) )
find "$find_str[@]}"
Существует более легкий способ выразить такой фильтр.
#!/bin/bash
exclude_patterns=("excl*_dirx" "excl*_diry")
exclude_args=()
while [[ ${#exclude_patterns} -gt 0 ]]; do
exclude_args+=( -path "./${exclude_patterns[1]}/*" -prune -o )
shift exclude_patterns
done
find "${exclude_args[@]}" -type f
Пожалуйста:
#!/bin/bash
excl_d=("excl*_dirx" "excl*_diry")
find_str=". "
for ((i=0 ; i<$((${#excl_d[*]})) ; i++)); do
if [[ $i > 0 ]]; then
find_str+=" -o "
fi
find_str+=" -path \"./\${excl_d[i]}\" -prune "
done
find_str+=" -o -type f -print "
# this is just for debugging
echo "[debug] value of str = find $find_str"
eval "find ${find_str}"
Проблема здесь - это, когда удар выполняет строку в сценарии find ${find_str}
это затем выполняется, находят со всего одним аргументом, т.е. argc аргумент основной функции в находке будет равен 2. eval
по контрасту составляет строку, которая затем передает маркирование в ударе.
-prune
опция: если Вы делаете вещь как Вы представленный в Вашем Q затем, у Вас есть некоторые причины сделать так. Я не делаю предположений на чьем-то опыте. Числа (я имею в виду репутацию, e.t.c.) бессмысленны в некотором смысле
– Serge
29.09.2012, 05:40