انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: Droid در 16 بهمن 1394، 12:56 بظ
-
میخوام خروجی دستور توی متغیر ذخیره بشه، ولی هم اینکه چاپ میشه (دقیقا تمام مقدار متغیر manifest رو میده بیرون) ، بعد هم که متعیر label رو چاپ میکنم هیچی دیده نمیشه.
label=$(grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest")
این شکلی هم نوشتم، که چیزی چاپ نمیکنه ولی مقدار label مثل بالا خالیه.
label="$( <<EOF
grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest"
EOF
)"
بازم ](*,)
-
محتوای manifest چیه؟ خطی که در اون تعریف شده رو بگذارید.
-
همونی که توی سوال قبلیم (http://forum.ubuntu.ir/index.php/topic,130516.0.html) روش regex مینوشتم یعنی لینک (http://paste.ubuntu.com/14886481/)
البته بعد نوشتن سوال اینجوری حلش کردم \\:D/ ، در کل میخواستم یه اسکریپت بنویسم که فایلهای apk رو دسته جمعی بر اساس یه سری مقادیر داخل manifest ش تغییر نام بدم که مرتب بشن، به هدفم رسیدم (البته جا برای کامل تر و بهتر کردن داره)، ولی خب دوست دارم اتفاقی که میفتاد رو بدونم.
#!/bin/bash
rename_move() {
./aapt debug badging "$1" > temp
label=$(cat temp | grep -Po "(?<=application: label=')(.+?)(?=')")
package=$(cat temp | grep -Po "(?<=package: name=')(.+?)(?=')")
version_code=$(cat temp | grep -Po "(?<=versionCode=')(.+?)(?=')")
version_name=$(cat temp | grep -Po "(?<=versionName=')(.+?)(?=')")
mv -f "$1" "$label - $version_name - $version_code - $package.apk"
}
for f in *.apk
do
rename_move "$f"
done
محتوای manifest چیه؟ خطی که در اون تعریف شده رو بگذارید.
اینجوری مینوشتم:
manifest=$(./aapt debug badging "$1")
label=$(grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest")
-
اینجا اشتباه کردی و یک جریان (Stream) رو بهعنوان فایل به grep دادی:
# wrong
label=$(grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest")
# correct
label=$(echo "$manifest" | grep -Po "(?<=application: label=')(.+?)(?=')")
میتونی از نمونهٔ زیر هم استفاده کنی. البته استفاده از این نوع تابعها برای من کلاً اشتباست:
#!/usr/bin/env bash
# filename: manifest.sh
parse() {
local na="(?<=package: name=')(.+?)(?=')"
local la="(?<=application: label=')(.+?)(?=')"
local vc="(?<=versionCode=')(.+?)(?=')"
local vn="(?<=versionName=')(.+?)(?=')"
name=$(grep -Po "$na" "$1")
label=$(grep -Po "$la" "$1")
version_code=$(grep -Po "$vc" "$1")
version_name=$(grep -Po "$vn" "$1")
}
rename() {
mv -f "$1" "$label - $version_name - $version_code - $name.apk"
}
reform() {
parse "$1"
rename "$1"
}
find . -iname '*.apk' | while read -r filename; do
reform "$filename"
done
-
میتونید اینها رو مطالعه کنید:
لینک ۱ (http://stackoverflow.com/questions/12451278/bash-capture-stdout-to-a-variable-but-still-display-it-in-the-console)
لینک ۲ (http://tldp.org/LDP/abs/html/io-redirection.html)
-
از راهنمایی های هر دو عزیز ممنونم :)
پی نوشت ندارم
پی لینک (http://forum.ubuntu.ir/index.php/topic,17327.msg528642.html#msg528642)