Проблема авторасширения с элементами массива, содержащими '*' (звездочка)

У Вас почти был он. $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") , ",";

?>
1
28.09.2012, 21:48
2 ответа

Проблема здесь - это 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
1
27.01.2020, 23:39
  • 1
    Одним словом:Фантастика! я никогда не мог бы вытянуть все это прочь один (все же), потому что я все еще изучаю усовершенствованный материал как функции и массивы (после того, как рассмотрение меня достаточно безопасный в основах, которые взяли путь дольше, чем, я ожидал). Большое спасибо, Ваш подход выглядит как будто взятым из учебника. –  syntaxerror 29.09.2012, 05:24

Пожалуйста:

#!/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 по контрасту составляет строку, которая затем передает маркирование в ударе.

1
27.01.2020, 23:39
  • 1
    Спасибо за попытку, но не, который не решает проблему. Я все еще получаю также файлы в каталогах, которые находятся в моем списке исключения. Хотя те фигурные скобки могут исправить много, они не универсальное средство также. –  syntaxerror 28.09.2012, 20:11
  • 2
    См. ответ на комментарий jw013. (2.)) BTW, я сделал вставку копии сценарий и протестировал его, и не было никаких ошибок. –  syntaxerror 28.09.2012, 20:15
  • 3
    Спасибо за обновление, но это все еще не работает. То же как прежде: существуют файлы, показанные, которые являются внутренними каталогами в моем списке исключения. Гм, можно ли попытаться использовать обновленный сценарий на моем демонстрационном дереве каталогов наверху этой страницы, таким образом предварительно тестируя его прежде, чем больше пытаться этих диких экспериментов? Я уже провел слишком много времени с эмпирическим сам, вот почему я спросил здесь.Прошу прощения. –  syntaxerror 28.09.2012, 20:32
  • 4
    @syntaxerror еще раз. проверенный Ваши файлы –  Serge 28.09.2012, 20:40
  • 5
    @syntaxerror Да, и это - то, почему я не сделал предложил Вас, которые с самого начала и указали на Вас -prune опция: если Вы делаете вещь как Вы представленный в Вашем Q затем, у Вас есть некоторые причины сделать так. Я не делаю предположений на чьем-то опыте. Числа (я имею в виду репутацию, e.t.c.) бессмысленны в некотором смысле –  Serge 29.09.2012, 05:40

Теги

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