Daemon786: переводы
Bash by example / Bash в примерах
→Package Description
linux The actual kernel
util-linux A collection of miscellaneous Linux-related programs
e2fsprogs A collection of ext2 filesystem-related utilities
glibc The GNU C library
linux The actual kernel
util-linux A collection of miscellaneous Linux-related programs
e2fsprogs A collection of ext2 filesystem-related utilities
glibc The GNU C library
0 Пакет Описание
linux Действующее ядро
util-linux Набор разнообразных Linux-программ
e2fsprogs Набор утилит для работы с файловой системой ext2
glibc Библиотека GNU C
linux Действующее ядро
util-linux Набор разнообразных Linux-программ
e2fsprogs Набор утилит для работы с файловой системой ext2
glibc Библиотека GNU C
→As you can see, arguments can be referenced inside the function definition by using the same mechanism used to reference command-line arguments. In addition, the "$#" macro will be expanded to contain the number of arguments. The only thing that may not work completely as expected is the variable "$0", which will either expand to the string "bash" (if you run the function from the shell, interactively) or to the name of the script the function is called from.
0 Как вы можете видеть, внутри функции можно ссылаться на аргументы, используя тот же механизм, который используется для ссылки на аргументы командной строки. Кроме того, "$#" будет содержать в себе количество аргументов. Единственное, что может работать не так, как ожидалось, это переменная "$0", которая будет раскрыта как строка "bash" (если вы запустили функцию из оболочки интерактивно) или как имя сценария, в котором вызвана функция.
→Why bash?
0 Почему bash?
→Configuration files
0 Конфигурационные файлы
→Wrapping it up
0 В заключение
→Resources
0 Ресурсы
→Chopping strings like a pro
0 Разбиваем строки как профессионалы
→Most of the time, while you can omit the use of double quotes surrounding strings and string variables, it's not a good idea. Why? Because your code will work perfectly, unless an environment variable happens to have a space or a tab in it, in which case bash will get confused. Here's an example of a fouled-up comparison:
0 В большинстве случаев можно не помещать строковые переменные в двойные кавычки, но это не слишком хорошая практика. Почему? Потому что ваш код будет работать правильно до тех пор, пока в строковой переменной не появится символы пробела или табуляции. В таком случае bash придет в некоторое замешательство. Вот пример никуда ни годного сравнения:
→This function will produce the output "hello" -- the global "$myvar" doesn't get overwritten, and "$x" doesn't continue to exist outside of myfunc. In the first line of the function, we create x, a local variable that is used later, while in the second example (local myvar="one two three"") we create a local myvar and assign it a value. The first form is handy for keeping loop control variables local, since we're not allowed to say "for local x in $myvar". This function doesn't clobber any global variables, and you are encouraged to design all your functions this way. The only time you should not use "local" is when you explicitly want to modify a global variable.
0 Эта функция будет выводить "hello" -- глобальная переменная "$myvar" не была перезаписана, и "$x" не продолжает существовать вне myfunc. В первой строке функции мы создаем локальную переменную x, которую используем позднее, в то время как, во втором случае (local myvar="one two three") мы создаем локальную переменную myvar и присваиваем ей значение. Первая форма удобна для хранения локальных переменных контроля цикла, так как недопустимо писать "for local x in $myvar". Данная функция не перезапишет никаких глобальных переменных, и вам рекомендуется разрабатывать таким образом все ваши функции. Вы не должны использовать "local" только в тех случаях, когда явно хотите изменить глобальную переменную.
→In this simple example, the bug is easy to spot and to compensate for by using alternate variable names. However, this isn't the right approach; the best way to solve this problem is to prevent the possibility of clobbering global variables in the first place, by using the "local" command. When we use "local" to create variables inside a function, they will be kept in the local namespace and not clobber any global variables. Here's how to implement the above code so that no global variables are overwritten:
0 В этом простом примере ошибку легко обнаружить и компенсировать с помощью альтернативных имен переменных. Однако это неправильный подход, лучший способ решения этой проблемы, предотвратить возможность перезаписи глобальных переменных, в первую очередь, с помощью команды "local". когда мы используем "local", чтобы создать переменные внутри функции, они будут храниться в локальном пространстве имен и не затрут какие-либо глобальные переменные. Вот как можно реализовать приведенный ниже код, чтобы никакие глобальные переменные не были перезаписаны:
→When this script is run, it produces the output "one two three three", showing how "$myvar" defined in the function clobbered the global variable "$myvar", and how the loop control variable "$x" continued to exist even after the function exited (and also would have clobbered any global "$x", if one were defined).
0 Когда этот сценарий запустится, он выведет "one two three three", показывая, как определенная в функции "$myvar" затерла глобальную переменную "$myvar", и как переменная контроля цикла "$x" продолжила существовать даже после завершения работы функции (и также затерла бы глобальную "$x", если та была определена).
→When this script is run, it produces the output "one two three three", showing how "$myvar" defined in the function clobbered the global variable "$myvar", and how the loop control variable "$x" continued to exist even after the function exited (and also would have clobbered any global "$x", if one were defined).
0 Когда этот сценарий запустится, он выведет "one two three three", показывая, как определенная в функции "$myvar" затерла глобальную переменную "$myvar", и как переменная контроля цикла "$x" продолжила существовать даже после завершения работы функции (и также затерла бы глобальную "$x", если та была определена).
→While true in C, this isn't true in bash. In bash, whenever you create an environment variable inside a function, it's added to the global namespace. This means that it will overwrite any global variable outside the function, and will continue to exist even after the function exits:
0 Несмотря на то, что это верно в C, в bash это не так. В bash всякий раз, когда вы создаете переменную окружения внутри функции, она добавляется в глобальное пространство имен. Это означает, что она может перезаписать любую глобальную переменную вне функции и будет продолжать существовать даже после завершения работы функции:
→Often, you'll need to create environment variables inside a function. While possible, there's a technicality you should know about. In most compiled languages (such as C), when you create a variable inside a function, it's placed in a separate local namespace. So, if you define a function in C called myfunction, and in it define a variable called "x", any global (outside the function) variable called "x" will not be affected by it, eliminating side effects.
0 Часто вам необходимо создать переменную окружения внутри функции. Если возможно, то запомните эту техническую особенность. В большинстве компилируемых языков программирования (таких как C), когда вы создаете переменную внутри функции, она будет расположена в отдельном локальном пространстве имен. Таким образом, если вы определите функцию в C с названием myfunction и в ней определите переменную с именем "x", то любая глобальная (за пределами функции) переменная с именем "x" не будет зависеть от нее, что устранит побочный эффект.
→Now that we've covered the most essential bash functionality, it's time to look at how to develop an entire application based in bash. In my next installment, we'll do just that. See you then!
0 Теперь, когда мы рассмотрели наиболее существенные возможности bash, пришло время посмотреть, как создать целую программу на bash. В моей следующей статье мы будем делать именно это. До встречи!
→Note:
Use'em interactively: Don't forget that functions, like the one above, can be placed in your ~/.bashrc or ~/.bash_profile so that they are available for use whenever you are in bash.
Use'em interactively: Don't forget that functions, like the one above, can be placed in your ~/.bashrc or ~/.bash_profile so that they are available for use whenever you are in bash.
0 Примечание:
Используйте их интерактивно: не забывайте, что функции такие, как приведенная выше, могут быть размещены в файлах ~/.bashrc или ~/.bash_profile так, что они будут доступны для использования всякий раз, когда вы находитесь в bash.
Используйте их интерактивно: не забывайте, что функции такие, как приведенная выше, могут быть размещены в файлах ~/.bashrc или ~/.bash_profile так, что они будут доступны для использования всякий раз, когда вы находитесь в bash.
→$ tarview shorten.tar.gz
Displaying contents of shorten.tar.gz (gzip-compressed tar)
drwxr-xr-x ajr/abbot 0 1999-02-27 16:17 shorten-2.3a/
-rw-r--r-- ajr/abbot 1143 1997-09-04 04:06 shorten-2.3a/Makefile
-rw-r--r-- ajr/abbot 1199 1996-02-04 12:24 shorten-2.3a/INSTALL
-rw-r--r-- ajr/abbot 839 1996-05-29 00:19 shorten-2.3a/LICENSE
....
Displaying contents of shorten.tar.gz (gzip-compressed tar)
drwxr-xr-x ajr/abbot 0 1999-02-27 16:17 shorten-2.3a/
-rw-r--r-- ajr/abbot 1143 1997-09-04 04:06 shorten-2.3a/Makefile
-rw-r--r-- ajr/abbot 1199 1996-02-04 12:24 shorten-2.3a/INSTALL
-rw-r--r-- ajr/abbot 839 1996-05-29 00:19 shorten-2.3a/LICENSE
....
0 $ tarview shorten.tar.gz
Displaying contents of shorten.tar.gz (gzip-compressed tar)
drwxr-xr-x ajr/abbot 0 1999-02-27 16:17 shorten-2.3a/
-rw-r--r-- ajr/abbot 1143 1997-09-04 04:06 shorten-2.3a/Makefile
-rw-r--r-- ajr/abbot 1199 1996-02-04 12:24 shorten-2.3a/INSTALL
-rw-r--r-- ajr/abbot 839 1996-05-29 00:19 shorten-2.3a/LICENSE
....
Displaying contents of shorten.tar.gz (gzip-compressed tar)
drwxr-xr-x ajr/abbot 0 1999-02-27 16:17 shorten-2.3a/
-rw-r--r-- ajr/abbot 1143 1997-09-04 04:06 shorten-2.3a/Makefile
-rw-r--r-- ajr/abbot 1199 1996-02-04 12:24 shorten-2.3a/INSTALL
-rw-r--r-- ajr/abbot 839 1996-05-29 00:19 shorten-2.3a/LICENSE
....
→Above, we define a function called "tarview" that accepts one argument, a tarball of some kind. When the function is executed, it identifies what type of tarball the argument is (either uncompressed, gzip-compressed, or bzip2-compressed), prints out a one-line informative message, and then displays the contents of the tarball. This is how the above function should be called (whether from a script or from the command line, after it has been typed in, pasted in, or sourced):
0 Выше мы определяем функцию с названием "tarview", которая принимает в качестве аргумента один какой-либо архив. Когда она выполняется, то определяет, какой тип архива был передан в виде аргумента (любой несжатый, сжатый gzip или сжатый bzip), печатает однострочное информационное сообщение, а затем отображает содержимое архива. Ниже указано как должна вызываться даннуя функция (из сценария или из командной строки, после того как она была напечатана или вставлена):
→Note:
Another case: The above code could have been written using a "case" statement. Can you figure out how?
Another case: The above code could have been written using a "case" statement. Can you figure out how?
0 Примечание:
Другой случай: приведенный код может быть написан с использованием оператора "case". Можете ли вы сказать каким образом?
Другой случай: приведенный код может быть написан с использованием оператора "case". Можете ли вы сказать каким образом?
→In bash, you can even define functions, similar to those in other procedural languages like Pascal and C. In bash, functions can even accept arguments, using a system very similar to the way scripts accept command-line arguments. Let's take a look at a sample function definition and then proceed from there:
0 В bash вы можете даже определять функции подобные тем, что есть в других процедурных языках программирования, таких как Pascal и C. В bash функции могут даже принимать аргументы с помощью системы, очень похожей на способ сценариев принимать аргументы командной строки. Давайте взглянем на пример определения функции:
Резюме
- Пол:
- мужчина
- Родной язык:
- русский
- С нами:
-
с 14 ноября 2010 г.
(5818 дней)
Не является членом клуба. - Деятельность:
-
178 версий перевода
с общим рейтингом 9
3 комментария
Карма: 3 (оценок: 3)
